2013-08-02 2 views
3

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

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

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

ответ

3

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

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

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

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


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

.dumpdebug 

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

1

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

MiniDumpWithFullMemory | MiniDumpWithHandleData | MiniDumpWithUnloadedModules | 
MiniDumpWithUnloadedModules | MiniDumpWithProcessThreadData | 
MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo | 
MiniDumpWithFullAuxiliaryState | MiniDumpIgnoreInaccessibleMemory | 
MiniDumpWithTokenInformation 
Смежные вопросы