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

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

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

Трассировка стека, которая выглядит следующим образом:

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

1 Ответ

0 голосов
/ 23 июля 2018

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

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

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

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

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

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

...