stg*_*lov 7 c# c++ debugging breakpoints visual-studio-2013
我在MSVC2013中进行混合调试存在严重问题.从本机C++ DLL调用COM方法后,调试器不再停止在断点处.
上图显示了代码的整体结构.
我有一个包含大约10个C#项目的解决方案,大约50个C++本机项目,以及一个C++/CLI项目,作为托管和本地世界之间的桥梁.启动项目是一个C#WPF项目(GUI Application),它Bridge在内部调用C++/cli project(),后者又调用各种本机C++ Dll(Various libraries).或者,我可以将C++控制台应用程序(Service console app)作为启动项目,仅用于测试目的.
我已经实现了一个库来从Autodesk Inventor文档文件中导入一些信息.Inventor Apprentice COM服务器(Inventor Apprentice图片上)用于实现它,可以与Inventor View 2015一起免费下载.作为第一步,导入是在独立的本机C++控制台应用程序中实现的,一切正常.然后它被改编为在整个基础架构中用作本机C++ dll(Import library),并且调试地狱开始了.
"调试坏了".在调试版本中,在调用以下COM方法之后Import library:
auto pComponentDefinitions = pDocument->GetComponentDefinitions();
Run Code Online (Sandbox Code Playgroud)
C++代码中的断点不再受到影响.即使我在另一个DLL的代码中设置断点,它也不会被命中.断点仍然可视化为完整的红色圆圈,因此这与PDB问题无关.应用程序本身继续执行,一段时间后我可以在GUI中看到正确的数据导入结果,这意味着Import library已正确执行.之后,我可以暂停GUI Application使用Break All按钮,在这种情况下,主线程显示在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.
Run Code Online (Sandbox Code Playgroud)
我试图在编译时将断点嵌入到代码中,方法是在有问题的导入代码之前和之后插入__debugbreak().第一个是命中(如果调试尚未打破),但第二个不是.另一方面,调试器清楚地注意到它,因为它将以下消息写入Output窗口:
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.
Run Code Online (Sandbox Code Playgroud)
Google没有为此诊断消息提供任何结果.听起来MSVC认为它正在调试托管代码,这实际上是原生代码.
"在电话中崩溃".在发布版本的情况下,在混合调试模式下运行应用程序会导致在有问题的COM调用期间rse.dll内部崩溃.
我使用MSVC 2013更新4.项目是在x64模式下构建的.使用Net Framework v4.0.使用Inventor 2015中的Inventor Apprentice.实验表明:
Service console app或仅在本机模式下附加到已运行的进程之后),一切正常(包括调试).GUI application已启动调试或调试器附加到工作进程,问题都会重现.可以在此处查看执行的完整运行列表.
以前有没有人见过类似的行为?这种行为可能是什么原因?有办法解决吗?
| 归档时间: |
|
| 查看次数: |
3086 次 |
| 最近记录: |