18

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

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

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

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

谢谢,尼基尔

4

4 回答 4

23

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

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

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

于 2008-09-11T23:02:02.393 回答
8

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

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

我相信这不支持 64 位进程......虽然在这一点上很想错。

于 2008-09-11T23:10:39.393 回答
2

对于使用 WinDbg 的任何人:

1>设置符号

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

.sympath
.sympath+ 
.symfix

2>设置源路径

.srcpath

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

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

添加 Microsoft.NET\Framework\v2.0.50727 for x86 使用-

.extpath 

为要加载的 clr 设置断点。

sxe ld:mscorwks

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

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

.chain

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

.loadby sos mscorwks

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

.reload

现在你都准备好了:)

(YMMV)

于 2008-09-12T13:29:00.813 回答
2

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

于 2009-04-08T22:47:40.730 回答