Win32: Есть ли разница между полным / мини дампом доктора Ватсона и написанием моего собственного? - PullRequest
3 голосов
/ 23 апреля 2010

У меня есть приложение, которое иногда падает в сборке релиза; к сожалению, похоже, что происходит сбой в сторонней DLL. Пытаясь разобраться с этим, я плавал в море КАК ТО и описаний того, как Windows создает аварийные дампы.

Я думал об использовании предложенного мини-дампа:

Получение дампа процесса, который падает при запуске

Я планировал оставить эту функцию в коде, чтобы дамп всегда создавался для моего приложения без предварительной настройки ПК. Кстати, это приложение не для распространения; он будет связан с нашим собственным оборудованием, поэтому я не беспокоюсь о том, что случайные пользователи могут создавать файлы дампа на своих компьютерах в случае сбоя приложения.

Дополнительное примечание: весь код написан на C / C ++.

Есть ли разница между тем, что д-р Уотсон (drwtsn32.exe) и этот код произведет для меня?

Ответы [ 4 ]

2 голосов
/ 23 апреля 2010

С доктором Уотсоном вы получите свалки только тогда, когда доктор увидит, что вы «разбились». Используя API дампера, вы сможете вызывать его из любой точки приложения. Например. Вы можете батутить обычные утверждения, чтобы сбросить вместо отображения диалога. По моему опыту, если у вас есть поддержка дампов в вашем приложении, вам будет проще исследовать, устранять неполадки и устранять различные проблемы просто потому, что вы можете создать полный дамп (или даже мини-дамп) в любом месте, где считаете нужным код.

1 голос
/ 23 апреля 2010

Самое большое, на что следует обратить внимание, это то, что MiniDumpWriteDump должен распределять память и выполнять операции ввода-вывода файлов. Вызов его изнутри сбойного процесса может завершиться неудачей, например, если структуры кучи повреждены.

Вызов MiniDumpWriteDump из вспомогательного процесса работает так же, как при использовании Dr. Watson, за исключением того, что у вас есть контроль над параметрами дампа.

Рекомендуемое чтение: тупик блокировки загрузчика в MiniDumpWriteDump

1 голос
/ 23 апреля 2010

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

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

Другой вариант, если у вас есть машина, которая чаще всего сталкивается с проблемой, это запустить ADPlus в фоновом режиме - он будет сидеть и ждать, пока ваше приложение не выйдет из строя или не сгенерирует исключения, а затем создаст несколько полезных файлов журнала , Он делает то же самое, что и фильтр необработанных исключений, за исключением того, что не требует никаких изменений в вашем приложении.

0 голосов
/ 23 апреля 2010

Я так не думаю. Хотя доктор Ватсон будет генерировать полный или мини-дамп, вы можете использовать отладчик ntsd вместо , чтобы получить гораздо больший контроль над тем, какие данные включены в дампы.

Мини-дампы доктора Ватсона достаточно хороши для большинства вещей, вы получаете стек вызовов и переменные. Если вам нужно больше, ntsd имеет множество опций .

Единственное преимущество использования DrWatson - это то, что он предустановлен в Windows.

...