MiniDumpWriteDump и его тип MINIDUMP_TYPE

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

MINIDUMP_TYPE в соответствии с MSDN поддерживает 23 флага. Но нет глубокого технического объяснения следующего вопроса: все ли они независимы в своих областях применения? Или их можно использовать парами, тройками? Могут ли они все использоваться одновременно? Могу ли я использовать их в некоторых группах (например, некоторые 3 флага - генерируют практически тот же дамп, что и другие 5 флагов)? Я имею в виду, когда я буду использовать для ex. Флаг 1+3 - будет абсолютно равным использованию флагов 4+6+9. Или флаг 1 или флаг 3 или... - это суперпозиция всех других флагов? Или что? Я хочу понять все возможные пересечения всех доступных флагов. Потому что, возможно, нет никакого смысла использовать флаги 3+12+14. Например, моя текущая цель - создать дамп с абсолютно всеми доступными данными в памяти. Я должен иметь возможность просматривать все потоки, все переменные local-static-global-in_heap. Я имею в виду, что когда я открою какой-нибудь дамп, сгенерированный комбинацией флагов bla+bla+bla - это должно быть абсолютно так же, как в случае, когда я могу подключить отладчик непосредственно к процессу. Я должен получить все возможные данные!

PS MiniDumpWithFullMemory - не дает мне такой способности (((Почему? Слово @FULL@ memory - не означает FULL? Это только часть чего?

2 ответа

Мини-дамп содержит кучу частей, которые представляют процесс. Память, используемая процессом, является лишь частью его. Метаданные о нитях, дескрипторах и т. Д. Являются дополнительными.

Все эти данные хранятся в отдельных "потоках" в файле.dmp (список которых можно посмотреть здесь).

Выбор того, какой из этих потоков включить, представлен через несколько флагов для MiniDumpWriteDump. Большая часть флагов затем используется для настройки объема памяти, включаемого в поток памяти, просто для того, чтобы разработчики могли минимизировать размер получаемого файла. Для всех создаваемых нами аварийных дампов мы обычно используем следующие флаги MINIDUMP_TYPE:

MiniDumpWithFullMemory | MiniDumpWithHandleData | MiniDumpWithModuleHeaders | 
MiniDumpWithUnloadedModules | MiniDumpWithProcessThreadData | 
MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo


WinDbg имеет недокументированную команду, которую вы можете использовать для выгрузки внутренних элементов файла аварийного дампа:

.dumpdebug

Вы можете использовать это при просмотре файла crashdump, чтобы увидеть, какие потоки были включены, увидеть все модули, разделы памяти и т. Д.

Для справки в будущем и поскольку информация по-прежнему очень скудно доступна: аналогичный вопрос уже задавался, см. Какая комбинация значений перечисления MINIDUMP_TYPE даст мне наиболее "полный" мини-дамп?. В ответах упоминается отличный, хотя (немного) устаревший ресурс отладки DebugInfo.com, указывающий, в частности, на статью http://www.debuginfo.com/articles/effminidumps.html. Обратите внимание, что новые флаги (доступные начиная с Windows 7 и, возможно, более ранних версий, таких как Windows Vista) действительно не объясняются. Похоже, что нет исчерпывающей истории версийMINIDUMP_TYPE flags и версия minium, указанная в документации API, не всегда кажется верной, поскольку в прошлом у меня были проблемы с использованием таких флагов, как MiniDumpWithFullMemoryInfo предположительно доступен с DbgHelp.dll 6.1 в Windows 7, пока я не обновил DbgHelp.dll версии 6.8 до (самой последней Windows 7) DbgHelp.dll версии 6.12.

Windows 7 действительно представила отчет об ошибках Windows (WER), и, глядя на документацию WerReportAddDump, можно наткнуться (среди прочего) наWerDumpTypeHeapDump, который (по состоянию на 27.07.2020) кажется эквивалентным минидампу типа

MiniDumpWithDataSegs
 | MiniDumpWithProcessThreadData
 | MiniDumpWithHandleData
 | MiniDumpWithPrivateReadWriteMemory
 | MiniDumpWithUnloadedModules
 | MiniDumpWithFullMemoryInfo
 | MiniDumpWithThreadInfo
 | MiniDumpWithTokenInformation
 | MiniDumpWithPrivateWriteCopyMemory

причем последние три флага, по-видимому, доступны только с Windows 7 (и требуют достаточно свежего DbgHelp.dll). Это, по-видимому, наиболее полный дамп, который может быть записан WER (без учета пользовательских типов дампа), и, вероятно, является хорошей отправной точкой с точки зрения минимума информации, которая должна быть записана для посмертной отладки, как если бы к процессу был подключен отладчик. заранее.

В VS 2010 он не распознает флаг MINIDUMP_TYPE MiniDumpWithModuleHeaders, У меня работают следующие флаги:-

MiniDumpWithFullMemory | MiniDumpWithHandleData | MiniDumpWithUnloadedModules |
MiniDumpWithUnloadedModules | MiniDumpWithProcessThreadData | 
MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo | 
MiniDumpWithFullAuxiliaryState | MiniDumpIgnoreInaccessibleMemory |
MiniDumpWithTokenInformation
Другие вопросы по тегам