Настройка посмертного отладчика для служб Windows

Можно ли создать полный дамп памяти службы Windows при ее сбое? Очевидно, что есть известные посмертные отладчики, которые могут собрать дамп памяти сбойного процесса. Но проблема со службами Windows заключается в том, что они работают в системном контексте, а не в пользовательском. Кто-нибудь может мне помочь?

До сих пор я пробовал это с WinDbg:

  • Я установил WinDbg в качестве посмертного отладчика по умолчанию, выполнив WinDbg -I.
  • Я проверил, что в обоих местах реестра (HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AeDebug и HKLM\SOFTWARE\Wow6432Node\Microsoft\WindowsNT\CurrentVersion\AeDebug) существуют две записи Auto и Debugger.
  • Я настроил WinDbg для автоматической записи дампов памяти при запуске, изменив запись отладчика на «Путь\WinDbg.exe» -p %ld –c «.dump /ma /u D:\CrashDump.dmp» -e %ld –g
  • Я убедился, что WinDbg имеет привилегии для целевого расположения файла дампа памяти с административными привилегиями и без них.

Но это не работает. :(

Если я пишу обычное приложение пользовательского режима, которое преднамеренно аварийно завершает работу после запуска, WinDbg всплывает и автоматически записывает файл .dmp в целевое расположение. Но если мой сервис падает, это не так. В диспетчере задач я вижу, что WinDbg запускается после сбоя процесса моей службы, но оба остаются в списке без файла дампа.


person Allgaeuer    schedule 16.12.2013    source источник


Ответы (1)


Убедитесь, что для параметра Auto для ключа AeDebug установлено значение 1. Также измените командную строку windbg на: "Path\WinDbg.exe" -p %ld –c ".dump /ma /u D:\CrashDump.dmp;qd" -e %ld –G

Если вы не отсоединитесь от отлаживаемой программы, отладчик будет ждать дальнейших команд. Также опция -G закроет отладчик сразу после завершения процесса. Простым в настройке и, вероятно, более подходящим для таких сценариев является procdump от sysinternals — он также может создавать полные дампы памяти, и вы устанавливаете его с помощью команды: procdump -ma -i D:\crashdump.

person Sebastian    schedule 16.12.2013
comment
Думаю, вы правы. Но если я попробую эту команду, procdump скажет: «Не запущен ни один процесс, соответствующий указанному имени». - person Allgaeuer; 17.12.2013
comment
Хм, это странно. Дома проверю, но даже у них на странице такой же вызов в примерах (technet.microsoft.com/en-us/sysinternals/dd996900.aspx). Убедитесь, что папка d:\crashdump существует. - person Sebastian; 17.12.2013
comment
Ах извините. Не имеет значения, существует ли уже папка, но функция регистрации в качестве отладчика Just-in-Time Debugger кажется недавно добавленной функцией ProcDump. В моем установленном SysinternalsSuite у меня был ProcDump v4.0. Благодаря вашей ссылке я скачал изолированный исполняемый файл версии 6.0. Теперь вызов работает. Спасибо. - person Allgaeuer; 18.12.2013
comment
@lowleveldesign Можно ли использовать параметр -accepteula с параметром -i? В документах procdump говорится, что при использовании параметра -i разрешены только параметры -ma, -mp и -d. В противном случае при первом сбое его службы procdump заблокируется, ожидая, пока он примет лицензионное соглашение (в качестве учетной записи службы), но он не увидит его, потому что он работает в нулевом сеансе. - person Marc Sherman; 18.12.2013
comment
@MarcSherman - спасибо, это очень хороший момент! Кажется, мы можем добавить этот параметр в командную строку. Поэтому финальная команда установки procdump должна быть: procdump -accepteula -ma -i D:\crashdump. - person Sebastian; 19.12.2013
comment
Похоже, что procdump -i добавляет -accepteula, см. документы. microsoft.com/en-us/windows-hardware/drivers/debugger/ - person Marc Sherman; 17.10.2019