使用已编译为/clr的C++-CLI库调试一个C可执行文件

5
我正在使用Visual Studio 2010调试一个主要由C语言编写的应用程序。通常情况下,我可以成功地附加调试器,但当我链接一个使用C++/CLI编写的库时,我遇到了一些问题。
如果我使用/clr标志编译库(对于这个尚未编写的库,我最终将不得不这样做),那么我将失去调试整个C应用程序的能力,即使与库调用无关的部分也是如此。我得到的是一个空圆圈,上面有黄色三角形和感叹号,而不是红色断点圆圈。悬停在它上面只会给我一个工具提示,说“当前不会触发断点。该行没有关联的可执行代码。可能的原因包括:条件编译或编译器优化。”
然后,如果我链接同样没有使用/clr标志编译的库,我再次能够调试我的应用程序。
我知道Visual Studio很可能无法调试使用C++/CLI编写的库,这没关系。我只想保留调试其余应用程序并至少查看对外部库的调用结果的能力。
另一个复杂因素是,这个项目并不是由Visual Studio构建的。它是使用外部make系统使用cl编译的,所以我可以通过这种方式自定义任何需要向编译器发出的命令。
有人知道为什么我无法按照自己想要的方式调试库吗?有什么建议可以提供吗?
2个回答

11
您需要在附加时选择调试器的类型,请注意对话框中的“附加到”标签。按下“选择”按钮并选中“Native”,以获取对本机代码调试的支持。 DLL还需要在您的任何断点命中之前加载。如果您不确定是否已执行此操作,请查看“调试>窗口>模块”调试器窗口以查看已加载的DLL。一旦调试器看到DLL加载并准备好断点,断点指示器就会从空心变为实心红色。

否则,支持调试C++/CLI,您可以选中“托管”和“Native”复选框,并在任一类型的代码中设置断点。唯一不支持的是从托管代码单步调试到本地代码,需要切换模式以激活正确的调试引擎,这需要代码命中断点。

考虑在本机项目中调试选项,您可以指定要启动的EXE。这样,您只需按F5开始调试并跳过附加程序的麻烦。


非常感谢您的回答。就是这样了。我从未意识到有不同类型的调试器。 - Drewmate

3
这可能也与“调试器类型”有关!(但这取决于你的具体构建配置,我不太清楚)
如果你的任何项目都使用了通用语言运行库支持(/clr)来编译,则应将启动项目中的调试器类型设置为“Mixed”,因为默认设置“Auto”可能会失败!
想象一下,你有两个项目:
1)非CLR C++项目,它是生成某些.exe文件的启动项目。
2)C++项目,它生成mylibrary.dll,因为它使用了一些托管代码,所以编译时启用了通用语言运行库支持。第一个项目的.exe调用了mylibrary.dll。
如果你使用默认值“Auto”启动第一个项目,则可以进入第一个项目进行调试,但无法进入第二个项目。调试器选择器意识不到你将要调用一个CLR库。
所以请设置项目属性->配置属性->调试->调试器类型为"Mixed"!

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