如何附加调试器以从托管 (C#) 包装器单步执行本机 (C++) 代码?
-
09-06-2019 - |
题
我有一个 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 开始)。