C++ 当外部源代码中发生异常时,无法正确使用自建小型转储文件的Stacktrace
当异常发生在外部源代码中时,我无法分析我自己创建的迷你转储文件的堆栈跟踪 堆栈跟踪 堆栈跟踪比如下所示:C++ 当外部源代码中发生异常时,无法正确使用自建小型转储文件的Stacktrace,c++,visual-studio,dll,pdb-files,minidump,C++,Visual Studio,Dll,Pdb Files,Minidump,当异常发生在外部源代码中时,我无法分析我自己创建的迷你转储文件的堆栈跟踪 堆栈跟踪 堆栈跟踪比如下所示: [Frames may be missing, no binary loaded for ForeignLib1.dll] Annotated Frame > ForeignLib1.dll!00000000454fc028 Unknown No symbols loaded. 但应该是这样的: ForeignLib1.dll!000000004
[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_TYPE mdt = (MINIDUMP_TYPE)(
MiniDumpWithDataSegs |
MiniDumpWithHandleData |
MiniDumpWithFullMemoryInfo |
MiniDumpWithThreadInfo |
MiniDumpWithUnloadedModules |
MiniDumpWithCodeSegs
);
回调例程包括以下类型:
IncludeModuleCallback
IncludeThreadCallback
ModuleCallback //(MyDll.dll and all ForeignLib-Dlls)
ThreadCallback
ThreadExCallback
DMP文件是使用MiniTumpWriteMap创建的
// 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文件,或者如何在外部源代码中发生异常时分析堆栈跟踪?我自己找到了解决方案。如果您拥有与Minidump完全相同的ForeinLib1.dll二进制文件,则可以在Visual Studio中分析堆栈跟踪: 右键单击卸载的DLL并选择“加载符号” 选择DLL文件,它必须是二进制文件,与“文件浏览”对话框中的小型转储文件中的二进制文件相同 VisualStudio在“新文件浏览”对话框中请求PDB文件。取消这个。 VisualStudio现在需要一些时间来分析DLL文件,对于50mb的文件,大约需要2分钟 堆栈跟踪现在已完成,或者必须加载下一个卸载的DLL文件
调试器需要来自外部代码的信息来确定每个堆栈帧的开始和结束位置。否则,堆栈只是调试器无法理解的二进制数据块。作为人类,您可以尝试根据可执行文件的内容将堆栈转储为32位或64位的字,并尝试找到每个调用的位置,然后尝试找出它们在外部代码中的位置。但这很费时,也很无聊。尝试获取外部可执行文件的调试符号可能更容易。感谢您提供的信息。我已经尝试获取外部可执行文件的PDB,但不幸的是,这是不可能的。他们不想展示内部流程。。。