Непоследовательное поведение от ADPlus / CDB - нет ошибки Runnable Debuggees в "g"
Я установил ADPlus / CDB как отладчик Just-In-Time по умолчанию на моей машине. Когда какой-либо процесс имеет необработанное исключение или происходит сбой по какой-либо другой причине, я хочу, чтобы ADPlus сгенерировал аварийный дамп для меня. Я использую файл конфигурации ADPlus для установки выходного каталога и запуска предварительной команды, которая используется для передачи файла dmp в облако.
Чтобы проверить, работает ли это, я написал действительно простую программу, которая выдает необработанное исключение и вылетает. ADPlus всегда подключается так, как положено, но только успешно генерирует дамп, который я хочу, примерно 1 в 15 раз. Ничего не меняя в своей системе, я запускаю программу аварийного завершения и получаю разные результаты.
В большинстве случаев я получаю следующую ошибку от cdb:
0:000> g
^ No runnable debuggees error in 'g'
0:000>
*[EOF]*
Когда это работает должным образом, то же самое место в журнале выглядит так:
0:004> g
FirstChance_epr_Process_Shut_Down
*[More stuff after here]*
Есть идеи, почему у меня такое поведение? Я могу опубликовать свой конфигурационный файл и полные журналы, если это будет полезно. Единственное различие между журналами "когда это работает" и журналами "когда это работает" состоит в том, что все строки начинаются с 0:004>
когда это работает и с 0:000>
когда это не так.
2 ответа
Комментарий не может содержать все это... так что выкладывать сюда...
Да, с DebugDiag вы можете иметь сценарий VBS с предварительным подключением и определять пользовательское действие (т. Е. Запускать сценарий VBS) при возникновении события.
Я думаю, вам нужно подождать, пока CDB завершит дамп и CDB/ ваш процесс завершится, прежде чем вы попытаетесь снова запустить приложение. (вы можете использовать tlist в вашем скрипте для мониторинга процессов... чтобы дождаться их исчезновения). ... в противном случае ADPlus с параметром -PN может пытаться подключить CDB к уже завершившемуся процессу... что не может быть, потому что отладчик уже подключен.
Установите TaskManager и посмотрите, появятся ли когда-нибудь несколько экземпляров вашего приложения (если вы это сделаете, вам, возможно, придется использовать опцию -p PID вместо этого, чтобы получить adplus для мониторинга правильного процесса... не идеально, так как вам нужно сначала запустили процесс, чтобы получить его PID).
Также обратите внимание на ProcDump, который использует технику, называемую "Отраженные процессы", которая позволяет очень быстро скопировать пространство процесса и позволить завершить дамп, не задерживая объекты..., который может помочь, если DebugDiag этого не делает.
Посмотрите на эту ссылку... прямо внизу... она показывает, как ждать, пока CDB завершит создание дампа (однако это скрипт Powershell).
Команда WinDbg "g" означает [Продолжить]
Поскольку вы открываете дамп-файл, вы не можете продолжить, он содержит только память процесса.
Так что сообщение "Нет ошибки запускаемых отладчиков в" g "" логично в вашем случае, так как процесс не запущен.
Для загрузки правильной версии SOS используйте следующую команду в зависимости от версии.NET.
.NET 4 и выше .loadby SOS
.NET 3.5 и 2.loadby sos mscorwks
.NET 1.0 и 1.1.load clr10 \ sos