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

时间:2020-03-05 18:51:54  来源:igfitidea点击:

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

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

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

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

谢谢,
尼基尔

解决方案

回答

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

如果非托管DLL是从另一个项目构建的(使用VS6构建我们的项目已有一段时间),只需确保我们已准备好DLL的pdb文件即可进行调试。

另一种方法是使用Cexe作为从DLL项目运行的目标exe,然后可以正常调试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 /克)
(等待mscorwks.dll上的ModLoad BP)

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

.chain

现在我们准备加载sos扩展。 :)

.loadby sos mscorwks

4>重新加载所有符号。

.reload

现在我们已经准备就绪:)

(YMMV)

回答

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