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 调试器在混合调试模式下停止命中断点 的相关文章

  • 使用 C#.net 中的私有存储库的身份验证读取 BitBucket API

    我已经尝试了几天让 BitBucket API 为我工作 但是当涉及到让它为具有身份验证的私有存储库工作时 将问题设置为私有 当它们设置为公开 无需身份验证 一切正常 代码示例如下 static void Main string args
  • 检查数据库中是否存在记录

    我正在使用这些代码行来检查记录是否存在 SqlCommand check User Name new SqlCommand SELECT FROM Table WHERE user txtBox UserName Text conn int
  • 为什么模板类的静态成员不唯一

    看一下下面的代码 include
  • 从 unsigned char* 到 char* 的转换无效

    这是一个代码 1 int main int argc char argv 2 3 signed char S psc 4 unsigned char U pusc 5 char C pc 6 7 C S 8 C U 9 10 pc psc
  • 为什么下面的重叠比较总是评估为 true

    我不明白为什么以下代码有警告 指出重叠比较始终评估为真 接下来的语句永远不会被执行 QVariant MainModel data const QModelIndex index int role const if index isVali
  • C 中的双重否定:是否保证返回 0/1?

    Is x 标准保证返回0 1 请注意 我是not询问 C 其中定义了 bool 类型 是的 在 C99 中 请参阅 6 5 3 3 4 逻辑非运算符的结果 是0如果其操作数的值比较 不等于0 1如果其操作数的值比较等于 0 结果具有类型in
  • 使用正则表达式解析日志文件

    我目前正在为我们的内部日志文件 由 log4php log4net 和 log4j 生成 开发一个解析器 到目前为止 我有一个很好的正则表达式来解析日志 除了一个烦人的一点 一些日志消息跨越多行 我无法正确匹配 我现在的正则表达式是这样的
  • 如何在 C# 中创建 PKCS12 .p12 文件?

    这可能是一个n00b问题 但我在这方面确实没有任何经验 我需要创建一个包含 X509 证书和私钥的 p12 捆绑包 我当前有两个对象 X509Certificate2 和包含关键信息的 RSAParameters 对象 如何将它们合并到 p
  • 如何在控制器中使用多个 DBContext

    如何在控制器中使用多个 DBContext 我尝试以不同的方式重载构造函数 一些控制器 public C1 DBContext1 a DBContext2 b DBContext3 c public C1 DBContext1 a publ
  • 无法在 Visual Studio 和 vcpkg 中构建 cmake 项目(致命错误 C1083)

    我今天安装了vcpkg 启用了与Visual Studio的集成 即 vcpkg集成安装 并开始安装库 我基本上安装了 cpprestsdk 并触发了 boost 库的安装 然后我在 Visual Studio CMake 中打开该项目 当
  • C# 中不区分大小写的替换不使用正则表达式?

    有没有一种方法可以在不使用 C 中的正则表达式的情况下对字符串进行不区分大小写的替换 像这样的东西 string x Hello x x Replace hello hello world 你可以尝试类似的东西 string str Hel
  • 代码块 - 使用大地址感知标志进行编译

    如何使用以下命令在 64 位系统上编译 32 位应用程序LARGE ADRESS AWARE使用代码块标记 我需要使用超过 2GB 的内存 应该是添加的情况 Wl large address aware到链接标志 我不使用 CodeBloc
  • C# SignalR 异常 - 连接在收到调用结果之前开始重新连接

    我正在开发 2 个应用程序 第一个是 C 控制台应用程序 另一个是 Asp net Web 应用程序 我正在使用 SignalR 连接两者 这是我的 C 控制台应用程序 客户端 public class RoboHub public sta
  • PowerShell 与 MongoDB C# 驱动程序方法不兼容?

    由 C 泛型引起的最新 MongoDB 驱动程序的问题 Cannot find an overload for GetCollection and the argument count 1 我可能可以使用其他没有泛型的 GetCollect
  • C# 从今天起 30 天

    我需要我的应用程序从今天起 30 天后过期 我会将当前日期存储在应用程序配置中 如何检查应用程序是否已过期 我不介意用户是否将时钟调回来并且应用程序可以正常工作 用户太愚蠢而不会这样做 if appmode Trial string dat
  • 在 boost 元组、zip_iterator 等上使用 std::get 和 std::tie

    我有哪些使用选择std get lt gt and std tie lt gt 与增强结构一起 例子 我想使用基于范围的 for 循环在多个容器上进行迭代 我可以实施zip函数 它使用boost zip iterator include
  • 什么是 C++11 扩展 [-Wc++11-extensions]

    我需要一些帮助来了解此错误发生的位置 警告 非静态数据成员的类内初始化是 C 11 扩展 Wc 11 extensions 这是它来自的代码部分 typedef struct Hand bool straight false bool fl
  • 没有 FPU 的处理器中的浮点计算

    是否可以在没有浮点单元的嵌入式处理器中执行浮点运算 是的 您只需要在软件中完成即可 你的编译器可能会提供支持 http gcc gnu org onlinedocs gccint Soft float library routines ht
  • 提升shared_from_this<>()

    有人可以用几句话概括一下如何提升shared from this lt gt 应该使用智能指针 特别是从使用绑定函数在 io service 中注册处理程序的角度来看 编辑 一些回复要求提供更多背景信息 基本上 我正在寻找 陷阱 即人们使用
  • SQL Server CE 不兼容的数据库版本

    我有一个 SQL Server CE 4 0 数据库 sdf文件 当我尝试从我的应用程序 WPF 对数据库进行查询时 出现以下错误 数据库版本不兼容 如果这是兼容文件 请运行修复 其他情况请参考文档 数据库版本 4000000 请求的版本

随机推荐

  • 如何更新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 本机项目和一个