无法从C#调试非托管的DLL

32
我有一个使用C++编写的DLL,并从C#应用程序中调用。该DLL是非托管代码。
如果我在后置生成事件中将DLL和其.pdb文件复制到C#应用程序的调试执行目录下,我仍然无法触发放置在DLL代码中的任何断点。断点会显示一条消息,指示“未加载此文档的符号”。
我需要做什么才能在DLL源代码中进行调试?
我已经禁用了“工具->选项->调试->常规->仅启用我的代码”选项。 DLL正在使用“运行时跟踪和禁用优化(/ASSEMBLYDEBUG)”编译,并将生成调试信息设置为“是(/DEBUG)”。
4个回答

61
要调试C++ DLL,你需要在解决方案中启用混合模式调试。
  • 右键单击项目 -> 属性
  • 转到“调试”选项卡
  • 勾选“启用非托管代码调试”
这将允许你以 F5 方式调试本地代码。如果你想为附加到进程启用它,则需要在“附加到进程”对话框中执行以下操作:
  • 选择要调试的进程
  • 点击进程列表上面的“选择...”按钮
  • 点击“调试这些代码类型”
  • 选中 托管代码 和 本地代码

3
请注意,如果您的创业项目使用另一个调用C++ DLL的C# DLL项目,那么启动项目也必须开启“启用非托管代码调试”选项。 - Tom Bushell
2
在“解决方案资源管理器”中选择解决方案。从 >菜单|工具|选项|调试|常规 中选择并取消选中“要求源文件与原始版本完全匹配”。 - Martin
3
对于VS 2013,该设置现在被称为“启用本机代码调试”,仍然位于项目属性的“调试”选项卡中。 - chappjc
1
还有一点不要忘记:在“工具|选项|调试|常规”中,确保底部的“使用托管兼容模式”已被勾选。 - Chris O
很难找到的答案变得更简单了。我很感激! - makoshichi
显示剩余2条评论

4

您需要启用非托管(Native)调试。

如果您在进程启动后附加:

转到“工具”菜单,然后选择“附加到进程”,确保启用了本机调试。

您将看到一个只读编辑框:

附加到:托管代码、本机代码 [选择]

确保本机代码在列表中。如果没有,请添加它。

如果您从Visual Studio内部启动项目:

在您以调试模式启动的项目属性上,转到项目属性,然后选择调试选项卡。

确保选中此复选框:

启用非托管代码调试


1

当您附加到一个进程进行调试时,您必须指定您想要如何附加。您有几个选项,即托管和本机。为了使用非托管的C++调试C#代码,您必须作为托管和本机附加到进程(两者可以同时选择)。


1

曾经遇到过同样的问题,尝试了接受答案中提出的所有建议,但是未能成功调试非托管 DLL 中的断点!

然而,当我按照以下步骤操作后,最终成功调试了 DLL!

在“解决方案资源管理器”中选择解决方案
菜单>>工具>>选项>>调试>>常规中进行选择
取消选中“要求源文件与原始版本完全匹配


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接