我不能分析我自己创建的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文件,或者当异常发生在外部源代码中时,我如何分析堆栈跟踪?
1条答案
按热度按时间35g0bw711#
我自己找到了解决办法。如果你有来自Minidump的确切的ForeinLib1.dll(二进制相等),就可以在Visual Studio中分析堆栈跟踪:
1.右键单击卸载的DLL并选择“加载符号”
1.在文件浏览对话框中选择DLL文件(它必须与Minidump中的文件二进制相等)。
Visual Studio在新的文件浏览对话框中要求PDB文件。把这个取消掉。
Visual Studio现在需要一些时间来分析DLL文件(对于一个50mb的文件,大约需要2分钟)。
1.堆栈跟踪现在完成了,或者您必须加载下一个“卸载”的DLL文件。