Я не могу проанализировать трассировку стека моего собственного мини-дамп-файла, когда исключение произошло во внешнем исходном коде.
The Stack Trace чем выглядит так:
[Frames may be missing, no binary loaded for ForeignLib1.dll] Annotated Frame
> ForeignLib1.dll!00000000454fc028 Unknown No symbols loaded.
Но должно выглядеть так:
ForeignLib1.dll!00000000454d1fe8 Unknown No symbols loaded.
> MyDll.dll!get_modeldoc C++ Symbols loaded.
...(about 75 further Entries)
ForeignExecutable.exe!000000014000f973 Unknown No symbols loaded.
kernel32.dll!00007ffbae331fe4 Unknown Non-user code. Symbol loading disabled by Include/Exclude setting.
ntdll.dll!00007ffbaf07f061 Unknown Non-user code. Symbol loading disabled by Include/Exclude setting.
Мое приложение — это DLL, которая загружается во внешний исполняемый файл. Я не могу получить PDB-файл этого исполняемого файла, поэтому я не могу загрузить символы библиотеки ForeignLib1.dll …
Я создал Minidump со следующими флагами:
MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(
MiniDumpWithDataSegs |
MiniDumpWithHandleData |
MiniDumpWithFullMemoryInfo |
MiniDumpWithThreadInfo |
MiniDumpWithUnloadedModules |
MiniDumpWithCodeSegs
);
И CallbackRoutine включает в себя следующие типы:
IncludeModuleCallback
IncludeThreadCallback
ModuleCallback //(MyDll.dll and all ForeignLib-Dlls)
ThreadCallback
ThreadExCallback
DMP-файл создается с помощью MiniDumpWriteDump (…)
// generate the crash dump
BOOL result = MiniDumpWriteDump( hProc, procID, hFile,
mdt, sehPtr, NULL, &mci );
Когда в моем исходном коде возникает исключение, я могу проанализировать трассировку стека, загрузив свой PDB-файл:
//MySource.cpp
int a = 0;
int b = 5 / a; // Exception, but Stack Trace can be analysed in DMP-File.
Но когда Исключение возникает во внешнем исходном коде, который вызывается моим исходным кодом, я вижу только чужую dll в трассировке стека:
//MySource2.cpp
foreignModul->EnumDocuments2( nullptr ); // Exception, Stack Trace can't be analysed in DMP-File!!
Как я могу записать DMP-файл с правильной трассировкой стека или как я могу проанализировать трассировку стека, когда исключение произошло во внешнем исходном коде?
Я нашел решение сам. Если у вас есть точный файл ForeinLib1.dll (двоичный эквивалент) из мини-дампа, можно проанализировать трассировку стека в Visual Studio:
Щелкните правой кнопкой мыши на выгруженной DLL и выберите «Загрузить символы»VS-Скриншот загрузки символов
Выберите файл DLL (он должен быть двоичным, равным тому, который указан в мини-дампе) в диалоге File-Browse-Dialog.
Visual Studio запрашивает файл PDB в новом диалоге просмотра файлов. Просто отмени это.
VS-Скриншот Отмена выбора PDB
Visual Studio теперь нужно некоторое время для анализа DLL-файла (около 2 минут для файла размером 50 Мб).
Трассировка стека завершена, или вы должны загрузить следующий «выгруженный» DLL-файл.
Других решений пока нет …