Маленькие хитрости «посмертной» отладки

Как то заметил, что в списке запущенных процессов постоянно болтается три штуки cdb.exe:

aedebug_cdb

CDB – это консольная версия WinDbg, которая у меня установлена в качестве «посмертного» отладчика (postmortem debugger).Обычно при этом падение приложения не проходит незамеченным - запускается консоль отладчика на весь экран. Трудно не заметить. В данном же случае, по всей видимости, фатальное исключение случалось в привилегированном процессе в отдельной сессии, соответственно и консоль создавалась в другой сессии.

Как добраться до отладочной консоли в таком случае? Начнем с того, что при регистрации в качестве «посмертного» отладчика CDB использует следующую строку:

aedebug_debugger

Согласно документации первый “%ld” заменяется на PID аварийно завершающегося процесса. Про второй документация говорит что-то не очень внятное:

-e Event Signals the debugger that the specified event has occurred. This option is only used when starting the debugger programmatically.

Но в нашем случае, это не очень важно.

Далее все разновидности WinDbg поддерживают удалённую отладку. Запустить WinDbg/CDB в режиме сервера можно с помощью параметра “–server”, например:

cdb.exe -server npipe:pipe=debug notepad.exe

Эта команда запускает notepad.exe в отладчике и позволяет присоединиться к сессии удаленно, через именованную трубу «debug». Маленькая хитрость заключается в том, чтобы вместо cdb.exe указать скрипт, который сформирует строку для запуска отладчика вместе с уникальным именем трубы:

@cdb.exe -server npipe:pipe=aedebug-%1 -p %1 -e %2 –g

Теперь достаточно поменять значение Debugger на «c:\dbg\amd64\aedebug.cmd" %ld %ld» и готово:

aedebug_cmd

Узнать имя трубы можно посмотрев параметры запуска cdb.exe:

aedebug_server

Теперь можно подключиться к отладчику из под непривилегированной учетной записи:

windbg.exe –remote npipe:pipe=aedebug-2296,server=localhost
comments powered by Disqus