Stacktrace самостоятельно созданного Minidump-файла не может быть использован правильно, когда исключение произошло во внешнем исходном коде

Я не могу проанализировать трассировку стека моего собственного мини-дамп-файла, когда исключение произошло во внешнем исходном коде.

Трассировки стека

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 со следующими флагами:

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-файл с правильной трассировкой стека или как я могу проанализировать трассировку стека, когда исключение произошло во внешнем исходном коде?

1

Решение

Я нашел решение сам. Если у вас есть точный файл ForeinLib1.dll (двоичный эквивалент) из мини-дампа, можно проанализировать трассировку стека в Visual Studio:

  1. Щелкните правой кнопкой мыши на выгруженной DLL и выберите «Загрузить символы»VS-Скриншот загрузки символов

  2. Выберите файл DLL (он должен быть двоичным, равным тому, который указан в мини-дампе) в диалоге File-Browse-Dialog.

  3. Visual Studio запрашивает файл PDB в новом диалоге просмотра файлов. Просто отмени это.
    VS-Скриншот Отмена выбора PDB

  4. Visual Studio теперь нужно некоторое время для анализа DLL-файла (около 2 минут для файла размером 50 Мб).

  5. Трассировка стека завершена, или вы должны загрузить следующий «выгруженный» DLL-файл.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]