尽管启用了本机代码调试,但仍无法从托管调试本机代码

Posted

技术标签:

【中文标题】尽管启用了本机代码调试,但仍无法从托管调试本机代码【英文标题】:Unable to debug native code from managed despite enabling native code debugging 【发布时间】:2020-06-21 12:13:30 【问题描述】:

我有一个调用本机 dll 的托管项目 (.net 4.6.2)。如果我在本机代码中放置一个断点,它会命中它,但是如果我尝试检查堆栈变量,我会感到相当烦人

检查非托管类型“MyTypeInHere*”需要非托管 调试启用。请将调试器类型设置为“混合”并且 再试一次

我按照https://docs.microsoft.com/en-us/visualstudio/debugger/how-to-debug-managed-and-native-code?view=vs-2019、Debugging unmanaged code while debugging managed code 的步骤操作,但我仍然无法检查类型。

在托管项目属性中,在调试下我启用了enable native code debugging,在构建页面下我检查了allow unsafe code。在launchSettings.json 中,我有"nativeDebugging": true

另请注意,在本机项目属性设置中,我已将调试器类型设置为 mixed

有人知道是什么阻止我调试本机代码吗?

谢谢

【问题讨论】:

当断点工作时,您可以确定您正确配置了调试器。在单击堆栈跟踪窗口时必须小心一点,它可以让您跳转到托管方法。这会切换调试器引擎,它现在对非托管代码一无所知。 【参考方案1】:

有人知道是什么阻止我调试本机代码吗?

这很奇怪,我按照您的链接提供的示例进行操作,效果很好。其实所有的步骤都是规则。

所以请检查这些:

1) 请确保您的 c++ 项目使用 Active(Debug) 配置和 x64 平台。当您将Debugger type 更改为mixed 然后单击应用时,请记住重建项目。

2)在C#项目中引用原生代码时,请关闭VS实例,删除obj,bin,.vs隐藏文件夹,然后重新打开您的 c# 项目。之后,请务必检查Enable Native Code debugging,然后重新构建整个解决方案。

3) 在要中断的位置添加断点并开始单步执行代码。确保您已将断点放置在 C# 应用程序调用的代码中。

4)target gramework更改为4.7.2再次测试。

5)请尝试新建net framework 4.7.2c#项目,测试是否是旧项目导致的问题。

另外,如果所有步骤都不起作用,请do a repair in VS Installer。

【讨论】:

我正在研究的解决方案非常大,但我执行了第 1-4 步,但我仍然无法检查本机变量。明天我会尝试尝试5...如果它起作用或不起作用,那是什么意思?注意断点在托管代码和本机代码中都被命中(这从来都不是问题)。我真的不想修。

以上是关于尽管启用了本机代码调试,但仍无法从托管调试本机代码的主要内容,如果未能解决你的问题,请参考以下文章

vs无法调试 ,还没有为该文档加载任何符号

如何附加调试器以从托管(C#)包装器进入本机(C++)代码?

VS 远程调试问题

托管对象与本机对象

在 Visual Studio 2015 中调试本机应用程序加载的托管 DLL

在纯本机模式下开始调试 C# 启动项目