Как установить точку останова в самом начале выполнения программы - PullRequest
9 голосов
/ 01 апреля 2011

Как я могу остановить программу перед загрузкой любой из связанных библиотек DLL?

Я попытался установить функцию LoadLibraryExW в опции отладки Break At Function, и она останавливается на этой функции, но до этого у меня в окне вывода Visual Studio было следующее:

'test.exe': Loaded 'C:\Windows\System32\ntdll.dll', Symbols loaded (source information stripped).
'test.exe': Loaded 'C:\Windows\System32\kernel32.dll', Symbols loaded (source information stripped).
'test.exe': Loaded 'C:\Windows\System32\KernelBase.dll', Symbols loaded (source information stripped).
'test.exe': Loaded 'C:\Windows\System32\uxtheme.dll', Symbols loaded (source information stripped).
'test.exe': Loaded 'C:\Windows\System32\msvcrt.dll', Symbols loaded (source information stripped).
---- plus about 30 DLLs ---

Так как я могу остановить программу в отладчике перед загрузкой ntdll.dll? Хорошо, не перед загрузкой, но перед выполнением любой из DllMain функций и перед инициализацией любого из статических объектов.

Ответы [ 6 ]

7 голосов
/ 01 апреля 2011

Вы можете сделать это, добавив раздел реестра в «Параметры выполнения файла изображения» с именем вашего exe-файла.Добавьте значение строки типа «Debugger» и задайте для него значение «vsjitdebugger.exe», чтобы запустить диалоговое окно «Отладчик точно в срок».Который затем позволяет выбрать один из доступных отладчиков, включая Visual Studio.Это диалоговое окно запускается сразу после того, как Windows загрузила EXE-файл, прежде чем запускать какой-либо код.

Вот пример файла .reg, который вызывает диалоговое окно при запуске notepad.exe.Измените имя ключа на свой .exe:

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe]
"Debugger"="vsjitdebugger.exe"
2 голосов
/ 29 ноября 2012

Используя Gflags и WinDbg, вы можете автоматически подключаться к целевому приложению и устанавливать точку останова ДО загрузки любых DLL.

Для этого вам понадобится «Средства отладки для Windows». Вы можете получить это бесплатно от Microsoft. Включает в себя GFlags и WinDbg. Вы можете найти его по адресу: http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx

Используйте GFlags для установки параметров автоматической отладки в вашей целевой программе. Это самый простой способ настроить систему на запуск отладчика, который будет автоматически запускаться при запуске целевого приложения. Не нужно дурачиться с реестром, он внесет все необходимые изменения для вас.

Используйте GFlags, чтобы установить WinDbg для запуска в качестве отладчика. Измените фильтры событий для WinDbg для события «Создать процесс» с «Игнорировать» на «Включено». По умолчанию WinDbg не нарушает процесс создания вашей цели. Но если вам нужно или вы хотите установить точку останова в процессе создания, вы можете изменить эту опцию события. Самый простой способ изменить эту опцию - запустить WinDbg в вашем приложении, использовать его графический интерфейс для изменения опции через пункт меню «DEBUG | Event Filters ...» и его диалоговое окно, сохранить рабочее пространство и прекратить отладку. Затем начните все, что приведет к запуску вашего целевого приложения, и с этого времени для этой конкретной цели отладки WinDbg прекратит выполнение «Создать процесс».

Существуют и другие способы автоматической установки этого параметра в WindDbg, но они не так просты, как использование его графического интерфейса. Вы можете установить параметры командной строки для ее вызова, чтобы включить событие Create Process. WinDbg может запустить файл сценария, который установит для вас эту опцию. Вы можете установить переменную среды WinLSbg TOOLS, чтобы она указывала на ее файл "Tools.ini", и включить там событие процесса создания. И есть еще пара способов установить опцию события, чтобы включить точку останова в процессе создания.

Ссылка выше включает ссылки для справки по отладке с GFlags и WinDbg.

Для большинства нужд отладки разработчики не нуждаются или не хотят иметь точку останова при создании процесса (до загрузки всех обычных, базовых библиотек, необходимых для запуска). Но если вы это сделаете, WinDbg и несколько других бесплатных отладчиков, предоставляемых Microsoft, могут это сделать. Вам просто нужно изменить значение по умолчанию для этого события с игнорируемого на включенное.

1 голос
/ 01 апреля 2011

Вместо запуска с F5, просто начните отладку с F11 или F10.

0 голосов
/ 01 апреля 2011

Нет способа сделать это, потому что библиотеки DLL, от которых зависит ваш PE-исполняемый файл, загружаются системой (а не вашим процессом) еще до того, как процесс будет создан.Процесс начинается только тогда, когда ваш исполняемый файл связан со всеми функциями, импортированными из других DLL.

ADD: Но, конечно, подпрограммы DllMain работают для каждой DLL только при запуске процесса, и вы можетеотлаживать их.

0 голосов
/ 01 апреля 2011

Я не думаю, что вы можете сделать это с помощью обычного отладчика пользовательского режима в Visual Studio. Microsoft предоставляет бесплатный инструментарий для других средств отладки, включая kd (отладчик ядра) и windbg, которые могут прервать загрузку, но я сомневаюсь, что вы когда-нибудь сможете проверить процесс до того, как он загрузит ntdll. Это не совсем процесс в этот момент.

Чего вы пытаетесь достичь?

0 голосов
/ 01 апреля 2011

ntdll.dll загружается ядром при создании процесса. Я не знаю конкретно о других dll, но они, скорее всего, также загружены ядром.

Насколько я знаю, то, что вы пытаетесь сделать, не может быть сделано, если вы не написали руткит для перезаписи части кода создания процесса. Даже тогда я не уверен, действительно ли создаваемый процесс считается процессом до загрузки этих библиотек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...