调试 C# exe 调用的 C++ native dll(混合模式调试)
December 25, 2024About 1 min
调试 C# exe 调用的 C++ native dll(混合模式调试)
托管代码(managed code,C#/VB.NET 等跑在 .NET CLR 上的代码)经常会 P/Invoke 一个 C++ 写的 native dll。这种时候在 native dll 的 C++ 源码里下断点,断点常常是空心的,VS 提示「未为该文档加载任何符号(no symbols have been loaded for this document)」——因为默认的调试器只挂了托管引擎,没有挂 native 引擎。
要让断点命中,需要打开 混合模式调试(mixed-mode debugging),让 VS 同时挂托管和 native 两个调试引擎。步骤如下:
1. 关掉「仅我的代码」
Tools → Options → Debugging,取消勾选 Enable Just My Code (Managed only)。否则非本工程的 native 代码会被调试器跳过。
2. C++ dll 工程:Debugger Type 设为 Mixed
在 C++ dll 工程属性的 Debugging 页,把 Debugger Type 从 Auto 改成 Mixed (.NET Framework)(或对应的 Mixed 选项)。
3. C# exe 工程:启用 native 代码调试
在 C# exe 工程属性的 Debug 页,勾选 Enable native code debugging。这一项让托管进程在启动时同时加载 native 调试引擎。
4. 重新编译
重新编译 C++ dll,确保生成了对应的 .pdb。这时再回到源码下断点,断点就能命中了。
调试已经在跑的 C# exe:附加进程
如果要调的是一个已经运行起来的 C# 进程(不是从 VS 启动的),用 Debug → Attach to Process 附加。附加时点 Select...,在调试代码类型里同时勾上 Managed 和 Native,附加上去后 native dll 的断点才会生效。