c++ 当在外部源代码中发生异常时,无法正确使用自己创建的Minidump文件的堆栈跟踪

plupiseo  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(150)

我不能分析我自己创建的Minidump文件的堆栈跟踪时,异常发生在一个外国的源代码。

堆栈跟踪

堆栈跟踪看起来像:

[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

使用MiniDumpWriteDump(.)创建DMP文件

// 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.

但是,当异常发生在一个外来源代码中时,我的源代码调用了它,我只能在堆栈跟踪中看到foreign-dll:

//MySource2.cpp
foreignModul->EnumDocuments2( nullptr ); // Exception, Stack Trace can't be analysed in DMP-File!!

提问

我如何编写一个带有正确堆栈跟踪的DMP文件,或者当异常发生在外部源代码中时,我如何分析堆栈跟踪?

35g0bw71

35g0bw711#

我自己找到了解决办法。如果你有来自Minidump的确切的ForeinLib1.dll(二进制相等),就可以在Visual Studio中分析堆栈跟踪:
1.右键单击卸载的DLL并选择“加载符号”

1.在文件浏览对话框中选择DLL文件(它必须与Minidump中的文件二进制相等)。

  1. Visual Studio在新的文件浏览对话框中要求PDB文件。把这个取消掉。

  2. Visual Studio现在需要一些时间来分析DLL文件(对于一个50mb的文件,大约需要2分钟)。
    1.堆栈跟踪现在完成了,或者您必须加载下一个“卸载”的DLL文件。

相关问题