自己创建的Minidump-File的Stacktrace无法正确使用,当Exception出现在国外源代码中
Stacktrace of self created Minidump-File can't be used correctly, when the Exception occurred in foreign source code
我自己创建的Minidump-File的Stack Trace在国外源代码出现异常时无法分析
堆栈跟踪
堆栈跟踪看起来像:
[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
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.
但是当异常发生在我的源代码调用的外部源代码中时,我在 Stack Trace 中只看到 foreign-dll:
//MySource2.cpp
foreignModul->EnumDocuments2( nullptr ); // Exception, Stack Trace can't be analysed in DMP-File!!
问题
如何编写具有正确 Stack Trace 的 DMP 文件或在外部源代码发生异常时如何分析 Stack Trace?
我自己找到了解决方案。如果您从 Minidump 中获得了确切的 ForeinLib1.dll(二进制相等),则可以在 Visual Studio:
中分析 Stack Trace
右键单击卸载的 DLL 和 select "Load Symbols"
VS-Screenshot Load Symbols
Select 文件浏览对话框中的 DLL 文件(它必须是二进制等于来自小型转储的文件)。
Visual Studio 在新的文件浏览对话框中请求 PDB 文件。取消这个就好了
VS-Screenshot Cancel PDB Selection
Visual Studio 现在需要一些时间来分析 DLL 文件(50mb 文件大约需要 2 分钟)。
堆栈跟踪现已完成,否则您必须加载下一个 "unloaded" DLL 文件。
我自己创建的Minidump-File的Stack Trace在国外源代码出现异常时无法分析
堆栈跟踪
堆栈跟踪看起来像:
[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
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.
但是当异常发生在我的源代码调用的外部源代码中时,我在 Stack Trace 中只看到 foreign-dll:
//MySource2.cpp
foreignModul->EnumDocuments2( nullptr ); // Exception, Stack Trace can't be analysed in DMP-File!!
问题
如何编写具有正确 Stack Trace 的 DMP 文件或在外部源代码发生异常时如何分析 Stack Trace?
我自己找到了解决方案。如果您从 Minidump 中获得了确切的 ForeinLib1.dll(二进制相等),则可以在 Visual Studio:
中分析 Stack Trace右键单击卸载的 DLL 和 select "Load Symbols" VS-Screenshot Load Symbols
Select 文件浏览对话框中的 DLL 文件(它必须是二进制等于来自小型转储的文件)。
Visual Studio 在新的文件浏览对话框中请求 PDB 文件。取消这个就好了 VS-Screenshot Cancel PDB Selection
Visual Studio 现在需要一些时间来分析 DLL 文件(50mb 文件大约需要 2 分钟)。
堆栈跟踪现已完成,否则您必须加载下一个 "unloaded" DLL 文件。