使用Visual Studio调试dmp文件

前提

  1. 首先保证dmp,dll,pdb文件属于同一版本,否则Visual Studio 会提示“符号不匹配”,调试器就无法正确显示函数名、变量名和源码行。

  2. 代码文件可不同,不过定位到的代码位置可能会有偏差。

设置

  1. 在解决方案的“调试源文件”中,添加包含源代码的路径。(你可能需要新建一个解决方案,并在其中将dmp文件打开【文件->打开文件】)
    upload successful

  2. 调试->选项->符号中,添加.pdb文件的地址,或者将pdb文件已经和dll文件放于同目录下

upload successful

相关问题

根据需要选择调试模式

托管 (Managed) vs 非托管 (Native)

  • 托管代码 (Managed Code)
    运行在 .NET CLR(公共语言运行时) 里的代码,例如用 C#、VB.NET 写的程序。

    • 内存管理由 CLR 控制(垃圾回收 GC)。

    • 调试时需要 .NET 运行时的调试器支持。

  • 非托管代码 (Native Code)
    直接运行在操作系统上的机器代码,例如 C/C++ 编译出来的 exe/dll。

    • 内存分配/释放完全由程序员和系统 API 控制。

    • 调试时用的是原生调试器(WinDbg/VS 的 Native 调试引擎)。

“仅限托管调试” 是什么意思?

  • 当你在 Visual Studio 里选择 “仅限托管调试 (Managed Only)” 时:

    • VS 只会调试 .NET 代码(C#、VB.NET 等)

    • 如果程序中调用了 C/C++ 的原生 DLL 或者混合代码,那么这些部分调试器会忽略,看不到调用栈、变量。

  • 但如果程序里有:

  • C# 调用 C++ DLL(P/Invoke 或 C++/CLI),

  • 或者要分析 系统 API 调用、内存崩溃原因, 那么就需要选 “混合(托管+原生)调试”

.dmp文件是什么

  • .dmp 文件其实是某个时间点进程的快照,里面保存了程序的内存、寄存器、线程信息等。用 Visual Studio 打开 .dmp 文件后,VS 相当于把调试器“附加”到那个转储快照上。
  • 能在崩溃点或快照点查看调用堆栈、异常信息、内存等(但无法继续运行,只能分析)。

pdb文件和dll文件要位于同目录下?

  • 其实这并不是强制的,Visual Studio在搜索pdb文件的时候,大致会遵循以下顺序,放到同目录下只不过可能更加方便

    • DLL/EXE 内部记录的 绝对路径。

    • 你在 符号路径(Tools → Options → Debugging → Symbols)里配置的路径。

    • 符号服务器(如微软的 https://msdl.microsoft.com/download/symbols)。

    • 模块所在目录(DLL/EXE 同目录)

附加到进程?

Visual Studio 的调试器可以连接(附加)到一个已经在运行的进程上,而不是你自己在 VS 里启动的那个。

  • 比如,你的程序已经在后台运行,你不想重新启动它,就可以用 (调试 → 附加到进程) 来选择目标进程。一旦附加成功,你就能设置断点、查看线程、变量和调用栈等。
  • 当确定某个bug出现在某个工程中时,单独运行调试该工程,并将其附加到进程中,可以让调试过程更清晰简单。

使用Visual Studio调试dmp文件
https://weihehe.top/2025/09/25/Untitled/
作者
weihehe
发布于
2025年9月25日
许可协议