Маленькие хитрости «посмертной» отладки
Feb 8, 2009 · CommentsМаленькие хитростиОтладка
Как то заметил, что в списке запущенных процессов постоянно болтается три штуки cdb.exe:
CDB – это консольная версия WinDbg, которая у меня установлена в качестве «посмертного» отладчика (postmortem debugger).Обычно при этом падение приложения не проходит незамеченным - запускается консоль отладчика на весь экран. Трудно не заметить. В данном же случае, по всей видимости, фатальное исключение случалось в привилегированном процессе в отдельной сессии, соответственно и консоль создавалась в другой сессии.
Как добраться до отладочной консоли в таком случае? Начнем с того, что при регистрации в качестве «посмертного» отладчика CDB использует следующую строку:
Согласно документации первый “%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» и готово:
Узнать имя трубы можно посмотрев параметры запуска cdb.exe:
Теперь можно подключиться к отладчику из под непривилегированной учетной записи:
windbg.exe –remote npipe:pipe=aedebug-2296,server=localhost