Visual Studio 调试器在混合调试模式下停止命中断点

2024-04-21

我在 MSVC2013 中混合调试时遇到严重问题。从本机 C++ DLL 调用 COM 方法后,调试器不再在断点处停止。

代码结构

上图展示了代码的整体结构。

我有一个解决方案,其中包含大约 10 个 C# 项目、大约 50 个 C++ 本机项目和一个 C++/CLI 项目,充当托管世界和本机世界之间的桥梁。启动项目是一个C# WPF项目(GUI Application),它调用 C++/cli 项目(Bridge)在内部,依次调用各种本机 C++ Dll(Various libraries)。或者,我可以制作一个 C++ 控制台应用程序(Service console app)作为仅用于测试目的的启动项目。

我已经实现了一个库来导入一些信息欧特克发明家 https://en.wikipedia.org/wiki/Autodesk_Inventor文档文件。发明家学徒 COM 服务器(Inventor Apprentice在图片上)用于实现它,它是与。第一步,导入是在独立的本机 C++ 控制台应用程序中实现的,一切正常。然后它被改编为作为本机 C++ dll 在整个基础设施中使用(Import library),然后调试地狱就开始了。

Symptoms

“调试坏了”。在调试版本中,调用以下 COM 方法后Import library:

auto pComponentDefinitions = pDocument->GetComponentDefinitions();

C++ 代码中的断点不再被命中。即使我在另一个DLL的代码中设置断点,它也不会被命中。断点仍然显示为完整的红色圆圈,因此这与 PDB 问题无关。 应用程序本身继续执行,一段时间后我可以在 GUI 中看到数据导入的正确结果,这意味着Import library已正确执行。之后,我可以暂停GUI Application使用“全部中断”按钮,在这种情况下,主线程显示为深深地卡在 Inventor 的 dll 之一 (rse.dll) 中,这不可能是真的,因为该线程已完成导入,甚至返回了正确的结果。

在“输出”窗口中,我可以看到以下消息,出现在有问题的 COM 方法调用期间(访问冲突在 Apprentice 中似乎很正常):

First-chance exception at 0x000007FEDD451F0C (rse.dll) in GUIApplication.exe: 0xC0000005: Access violation writing location 0x000007FFFDE3AFCC.
The Common Language Runtime cannot stop at this exception. Common causes include: incorrect COM interop marshalling and memory corruption. To investigate further use native-only debugging.
First-chance exception at 0x000007FEDD455F6C (rse.dll) in GUIApplication.exe: 0xC0000005: Access violation writing location 0x000007FFFDE3EE6C.

我尝试在编译时将断点嵌入到代码中,方法是插入__debugbreak() https://msdn.microsoft.com/en-us/library/f408b4et.aspx有问题的导入代码之前和之后。第一个被命中(如果调试尚未中断),但第二个未被命中。另一方面,调试器清楚地注意到它,因为它将以下消息写入输出窗口:

The process hit a breakpoint the Common Language Runtime cannot continue from.
This may be caused by an embedded breakpoint in the native runtime or a breakpoint set in a can't-stop region.
To investigate further, use native-only debugging.

Google 根本没有给出此诊断消息的任何结果。听起来 MSVC 认为它正在调试托管代码,而这实际上是本机的。

“通话时崩溃”。在发布版本的情况下,在混合调试模式下运行应用程序会导致在有问题的 COM 调用期间 rse.dll 内部崩溃。

再现性

我使用 MSVC 2013 update 4。项目是在 x64 模式下构建的。使用.Net Framework v4.0。使用 Inventor 2015 中的 Inventor Apprentice。 实验表明:

  1. 当没有附加调试器时一切正常。
  2. 当使用仅本机调试时(通过Service console app或者在仅以本机模式附加到已运行的进程之后)。
  3. 在混合(即本机+托管)调试模式下,无论是否GUI application已通过调试启动或调试器已附加到工作进程。
  4. 在调试和发布模式下都存在问题,但表现不同。在调试构建中,会出现疯狂的调试问题(“调试损坏”),但在发布中,它只是在内部某处崩溃(“内部崩溃”)。

可以看到执行的运行的完整列表here https://docs.google.com/document/d/1nzMSU37gaVEbT43CY09gzPxzy4NwnhSzFAnjo_2tmQM/edit?usp=sharing.

主要问题

以前有人见过类似的行为吗?造成这种行为的原因可能是什么?有办法解决吗?


禁用 MSVC 的新托管调试引擎有助于解决该问题。可以通过转到“工具”>“选项”>“调试”>“常规”>勾选“使用托管兼容模式”来完成。


在尝试找到该问题的解决方法时,我发布了以下问题 https://stackoverflow.com/questions/33301820/start-debugging-on-c-sharp-startup-project-in-native-only-mode。 Hans Passant 不仅发布了解决方法,而且还发布了我的主要问题的解决方案。在 C++/CLI 互操作情况下,新的调试引擎似乎无法正常工作。

P.S.鉴于这些症状非常独特和疯狂,我决定发布完整的问题和答案,希望这些信息可以帮助将来遇到类似问题的人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual Studio 调试器在混合调试模式下停止命中断点 的相关文章

随机推荐

  • 如何更新vue组件中的props

    我想在 Vue 中创建自己的复选框 我想使用 fontawesome 的两个图标 锁定和解锁 当我的复选框被选中时 图标应该被锁定 否则解锁 这是我的代码
  • 配置文件的 PhpMyAdmin 安全警告[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 您的配置文件包含与默认 MySQL 特权帐户相对应的设置 无密码的 root 您的 MySQL 服务器以此默认值运行 容易受到入侵 您确实应该通过为用
  • 在 Vue Nuxt 中监视并重新加载 api 文件夹

    如何让 nuxt 监视 非标准 目录并重新编译 重新加载自身 更具体地说是针对具有附加服务器 API 的目录 我有我的 Express api api 因为我引用了目录serverMiddleware使用 api 我希望当我对该目录中的文件
  • 哪种 utf8 排序规则最好? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想要一个 UTF8 排序规则来支持 English Persian Arabic French Jap
  • 为什么我会从“for i in ar”中的“ar[i]”得到 IndexError(或 TypeError,或者只是错误的结果)?

    我正在尝试使用 a 对列表的值求和for环形 这是我的代码 def sumAnArray ar theSum 0 for i in ar theSum theSum ar i return theSum 我收到以下错误 line 13 th
  • php 数组与键数组和键数组的区别?

    假设我们有两个数组 a array 1 gt Apple 2 gt Microsoft 3 gt Microapple 4 gt Applesoft 5 gt Softapple b array 1 3 其中 b 数组表示要区分的数组 a
  • MySQL - 超类型/子类型设计

    我需要创建以下数据库 对于半卡车 我不需要额外的子类型 而对于汽车 我只需要这 3 个子类型 对于轿车 我需要四个子类型 对于 SELECT 我将使用 JOIN 规范化数据库 但我需要找到一种简单的方法来进行 INSERT 车辆表存储常用信
  • 如何使用 jq 提取所有(也嵌套)键名称

    如何提取所有键名称 即使是在带有 jq 的嵌套对象中 例如 我有 json a 1 b c 2 我想获得列表 a b b c 我知道对于顶级密钥我可以通过以下方式获得 to entries key 但是嵌套对象中的键又如何呢 Short j
  • 为什么前/后增量运算符表现错误?

    为什么 PHP 中变量的值在以下代码中没有一致的行为 问题是为什么最后一个例子中的第一个输出等于 11 而不是上面
  • 在 GKE 上运行的 Ruby 的 Stackdriver 错误报告

    从 GKE 上运行的 Rails 应用收集错误需要执行哪些步骤 我已将 stackdriver gem 添加到我的 Rails 应用程序中 并使用以下命令创建了一个自定义角色errorreporting errorEvents create
  • 如何在SqlCE中使用存储过程

    我刚刚安装了SQL Server 精简版 令我惊讶的是 我们不能在 sql server CE 中使用存储过程 我有 Sql Server CE 中存储过程的替代方案吗 我对存储过程非常着迷 我无法想象没有存储过程的应用程序 请帮忙 提前致
  • 如何关闭MIPS-GCC自动指令重排序?

    继这个问题之后 使用跳转 和链接 指令的奇怪 MIPS 汇编器行为 https stackoverflow com questions 3807480 weird mips assembler behavior with jump and
  • 使用 jQuery 在 AngularJS 元素指令上绑定事件

    我在 AngularJS 中有一个指令 module angular module demoApp null module directive sample function return restrict E transclude tru
  • 吃豆人:眼睛是如何找到回到怪物洞的路的?

    我在 吃豆人 中发现了很多关于鬼魂人工智能的参考 但没有提到在鬼魂被吃豆人吃掉后 眼睛如何找到回到中央鬼洞的路 在我的实现中 我实现了一个简单但糟糕的解决方案 我只是在每个角落都硬编码了应该采取的方向 有更好 或最好的解决方案吗 也许是一个
  • C#/.NET 分析器应具有哪些功能?

    这可能是一则边缘广告 更不用说主观了 但这个问题是诚实的 在过去的两个月里 我一直在为 NET 开发一个新的开源分析器 称为 SlimTune Profiler http code google com p slimtune http co
  • SwiftUI 是否可以调用该函数并从其他页面更改视图?

    这是我的代码 struct FirstPage View var body some View VStack NavigationView VStack Text First Page bold NavigationLink destina
  • Node.js 异步等待 - 错误 regeneratorRuntime

    我学习了如何在浏览器中使用 Promise 但是当我想在 Node js 中使用它时 它会抛出错误 var ref asyncToGenerator PURE regeneratorRuntime mark function callee
  • 将 CVPixelBuffer 渲染到 NSView (macOS)

    我有一个CVPixelBuffer我正在尝试在屏幕上有效地绘制 转变为低效率的方式NSImage可以工作 但速度非常慢 丢掉了大约 40 的帧数 因此 我尝试使用将其渲染在屏幕上CIContext s drawImage inRect fr
  • 使用 SharedSizeGroup 测量/排列网格

    两个包含以某种方式指定的元素的网格和 SharedSizeGroup 似乎存在一些问题 这个问题是为了回答先前的问题 https stackoverflow com questions 3865033 grid height not adj
  • Visual Studio 调试器在混合调试模式下停止命中断点

    我在 MSVC2013 中混合调试时遇到严重问题 从本机 C DLL 调用 COM 方法后 调试器不再在断点处停止 代码结构 上图展示了代码的整体结构 我有一个解决方案 其中包含大约 10 个 C 项目 大约 50 个 C 本机项目和一个