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