当外部源代码中发生异常时,无法正确使用自创建的小型转储文件的堆栈跟踪
Stacktrace of self created Minidump-File can't be used correctly, when the Exception occurred in foreign source code
当外部源代码中发生异常时,我无法分析我自己创建的小型转储文件的堆栈跟踪。
堆栈跟踪
堆栈跟踪比如下所示:
[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 文件是使用 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 文件,或者在外部源代码中发生异常时如何分析堆栈跟踪?
我自己找到了解决方案。如果你有来自Minidump的确切的ForeinLib1.dll(二进制相等(,则可以在Visual Studio中分析堆栈跟踪:
-
右键单击卸载的 DLL,然后选择"加载符号" VS-屏幕截图加载符号
-
在文件浏览对话框中选择 DLL 文件(它必须等于小型转储中的二进制文件(。
-
Visual Studio在新的File-Browse-Dialog中请求PDB文件。只需取消此内容即可。 VS-屏幕截图取消 PDB 选择
-
Visual Studio现在需要一些时间来分析DLL文件(50mb文件大约需要2分钟(。
-
堆栈跟踪现已完成,或者您必须加载下一个"已卸载"DLL 文件。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++类内存结构中创建"spacer"?
- 终端不会为C++文件创建.exe文件吗
- 当外部源代码中发生异常时,无法正确使用自创建的小型转储文件的堆栈跟踪