我有一个 C++ 函数调用的包装器,我从 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 文件方便进行调试。

另一种方法是使用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 开始)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top