MiniDumpWriteDump и его тип MINIDUMP_TYPE

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

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

P.S. MiniDumpWithFullMemory - не дает мне такой возможности((( Почему? слово @FULL@ память - не означает ПОЛНАЯ? это только часть чего?


person graphElem    schedule 02.08.2013    source источник


Ответы (3)


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

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

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

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


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

.dumpdebug

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

person josh poley    schedule 17.08.2013


Для дальнейшего использования и поскольку информация по-прежнему доступна лишь в редких случаях: аналогичный вопрос уже задавался, см. values-will-give-me-the-most-comp">Какая комбинация значений перечисления MINIDUMP_TYPE даст мне наиболее полный мини-дамп?. В ответах упоминается отличный, хотя и (немного) устаревший ресурс для отладки DebugInfo.com со ссылкой на статью http://www.debuginfo.com/articles/effminidumps.html#minidumptypes. Обратите внимание, что новые флаги (доступные начиная с Windows 7 и, возможно, более ранних версий, таких как Windows Vista) действительно не объясняются. Кажется, что нет исчерпывающей истории версий флагов MINIDUMP_TYPE, а минимальная версия, указанная в документации 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 июля 2020 г.) кажется эквивалентным типу минидампа

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

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

person da22e    schedule 27.07.2020