如何将调试器附加到托管(C#)包装器中的本机(C ++)代码中?

我有一个C ++函数调用的包装器,我从C#代码调用它。 如何在Visual Studio中附加调试器以进入本机C ++代码?

这是我所拥有的包装器,它调用C ++文件中定义的GetData():

[DllImport("Unmanaged.dll", CallingConvention=CallingConvention.Cdecl, EntryPoint = "GetData", BestFitMapping = false)] public static extern String GetData(String url); 

代码崩溃,我想调查根本原因。

谢谢,尼基尔

检查项目属性页面上的Debug选项卡。 应该有一个“启用非托管代码调试”复选框。 当我们为旧的c ++ DLL开发新的.NET UI时,这对我有用。

如果您的非托管DLL是从另一个项目构建的(有一段时间我们正在使用VS6构建),请确保您拥有DLL的pdb文件,以便进行调试。

另一种方法是使用C#exe作为目标exe从DLL项目运行,然后您可以正常调试您的DLL。

除了Lou关于启动调试器的建议之外,您还可以通过单击“附加到进程”对话框中的“选择…”并选择“托管代码”和“附加到现有进程”来选择使用哪些调试引擎本地代码’。

以这种方式调试称为混合模式调试。 有关一些提示,请参阅此博客文章 。

我相信这对64位进程不支持…虽然在这一点上会喜欢错。

对于使用WinDbg的任何人:

1>设置符号

看看这些命令。 (帮助:在控制台.hh 中)

 .sympath .sympath+ .symfix 

2>设置源路径

 .srcpath 

3>加载SOS扩展以调试托管/混合模式程序。

(确保正确设置了扩展路径)

使用以下命令为x86添加Microsoft.NET \ Framework \ v2.0.50727-

 .extpath 

设置要加载的clr的断点。

 sxe ld:mscorwks 

(F5 / g)(等待mscorwks.dll上的ModLoad BP)

确保您没有已加载的重复sos扩展。 看到:

 .chain 

现在我们已经准备好加载sos扩展了。 🙂

 .loadby sos mscorwks 

4>重新加载所有符号..

 .reload 

现在你们都准备好了:)

(YMMV)

64位模式不支持混合调试(从Visual Studio 2008开始)。