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

时间:2012-04-18 16:52:05

标签: visual-studio visual-studio-2010 c++-cli

我正在使用Visual Studio 2010来调试主要用C语言编写的应用程序。通常,我可以很好地附加调试器,但是当我在用C ++ / CLI编写的库中链接时,我遇到了一些问题。

如果我使用/clr标志编译库(我最终必须为此编写未编写的文件),那么我将失去调试整个C应用程序的所有能力,即使是没有任何内容的部分也是如此与库调用有关。我得到了一个带有黄色三角形和感叹号的空心圆圈,其中应该有一个红色的断点圆圈。将鼠标悬停在它上面只给我一个工具提示,说“断点当前不会被命中。没有可执行代码与此行关联。可能的原因包括:条件编译或编译器优化。”

然后,如果我链接到编译的完全相同的库而没有 /clr标志,我再次能够调试我的应用程序。

据我所知,visual studio不太可能调试用C ++ / CLI编写的库,这没关系。我只想保留调试应用程序其余部分的能力,至少看看我调用外部库的结果。

另一个复杂因素是该项目不是由visual studio构建的。它是使用使用cl的外部make系统编译的,因此我可以自定义需要以这种方式发送给编译器的任何命令。

有谁知道为什么我现在无法以我想要的方式调试库?我有什么建议吗?

2 个答案:

答案 0 :(得分:9)

附加时,您必须选择调试器的。请注意对话框中的“附加到”标签。按“选择”按钮并勾选“Native”以获得对调试本机代码的支持。在任何断点可以命中之前,还需要加载DLL。如果您不确定是否已完成,请查看Debug> Windows>模块调试器窗口以查看加载的DLL。一旦调试器看到DLL加载并设置了断点,断点指示器就会从空心变为纯红色。

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

考虑本机项目中的Debug选项,您可以指定一个EXE来启动。因此,您只需按F5即可开始调试并跳过附加麻烦。

答案 1 :(得分:3)

它可能还与调试器类型有关! (但这取决于我不了解的具体建筑配置)

如果您的任何项目符合公共语言运行时支持(/ clr),您应该将启动项目中的调试器类型设置为“混合”,因为默认设置“自动”可能会失败!

想象一下,你有两个项目:

1)非CLR C ++项目,它是生成一些.exe文件的启动项目。

2)一个C ++项目,它生成mylibrary.dll,它使用公共语言运行时支持编译,因为它使用了一些托管代码。第一个项目的.exe调用mylibrary.dll。

如果启动第一个项目并将Debugger Type设置为其默认值“Auto”,您将能够调试到第一个项目,但不能调试到第二个项目。调试器选择器没有意识到您将调用CLR库。

所以设置项目属性 - >配置属性 - >调试 - >调试器类型为“混合”!