使用Visual Studio调试dmp文件
前提
首先保证dmp,dll,pdb文件属于同一版本,否则Visual Studio 会提示“符号不匹配”,调试器就无法正确显示函数名、变量名和源码行。
代码文件可不同,不过定位到的代码位置可能会有偏差。
设置
在解决方案的“调试源文件”中,添加包含源代码的路径。(你可能需要新建一个解决方案,并在其中将dmp文件打开【文件->打开文件】)
在调试->选项->符号中,添加.pdb文件的地址,或者将pdb文件已经和dll文件放于同目录下
相关问题
根据需要选择调试模式
托管 (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)里配置的路径。
模块所在目录(DLL/EXE 同目录)
附加到进程?
Visual Studio 的调试器可以连接(附加)到一个已经在运行的进程上,而不是你自己在 VS 里启动的那个。
- 比如,你的程序已经在后台运行,你不想重新启动它,就可以用 (调试 → 附加到进程) 来选择目标进程。一旦附加成功,你就能设置断点、查看线程、变量和调用栈等。
- 当确定某个bug出现在某个工程中时,单独运行调试该工程,并将其附加到进程中,可以让调试过程更清晰简单。