c++ - 当异常发生在国外源代码时,自创建的Minidump-File的Stacktrace无法正确使用

标签 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!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
    );

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.

但是当异常发生在由我的源代码调用的外部源代码中时,我只能在堆栈跟踪中看到外部 dll:

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

问题

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

最佳答案

我自己找到了解决方案。如果您从小型转储中获得了精确的 ForeinLib1.dll(二进制相等),则可以在 Visual Studio 中分析堆栈跟踪:

  1. 右键单击卸载的 DLL,然后选择“加载符号” VS-Screenshot Load Symbols

  2. 在文件浏览对话框中选择 DLL 文件(它必须是与小型转储中的二进制文件相同的二进制文件)。

  3. Visual Studio 在新的文件浏览对话框中请求 PDB 文件。取消这个就好了 VS-Screenshot Cancel PDB Selection

  4. Visual Studio 现在需要一些时间来分析 DLL 文件(50mb 文件大约需要 2 分钟)。

  5. 堆栈跟踪现已完成,否则您必须加载下一个“已卸载”的 DLL 文件。

关于c++ - 当异常发生在国外源代码时,自创建的Minidump-File的Stacktrace无法正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50364889/

相关文章:

c++ - 实现视频编辑器

c++ - Visual Studio下编译调试GLUT

c++ - 用冲突的命名空间替换 C++ 中的 dll

c++ - 从 DLL 函数调用非 DLL 函数

java - Jna,动态从java类中卸载Dll

c++ - 重载运算符拼图 : return *this, 还是临时变量?

c++ - 如何在 C++ 代码中指定 .config 文件的目录?

visual-studio - Visual Studio 编译源文件的顺序是什么?

javascript - 是否可以在 Visual Studio 中突出显示某些代码行?

.net - .NET Framework、CLR 和 Visual Studio 版本号如何相互关联?