2012-04-18 80 views
3

我使用Visual Studio 2010来调试主要是用C编写的正常情况下,应用程序,我可以附加调试得很好,但我在一些问题上运行当我链接到用C++/CLI编写的库时。调试用C++是C可执行 - CLI库编译/ CLR

如果我编译与/clr标志(我最终将不得不为此做尚未不成文库)的库,然后我失去了调试整个C应用程序的所有功能,甚至什么都没有做的部分图书馆电话。我得到了带有黄色三角形和感叹号的空圈,其中有一个红色的断点圆应该是。将鼠标悬停在它上面只能提供一个工具提示:“断点当前不会被触发,没有可执行代码与此行关联,可能的原因包括:条件编译或编译器优化。”

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

据我所知,Visual Studio将不太可能能够调试用C++/CLI库,那就是确定。我只想保留调试应用程序其余部分的功能,并且至少可以查看我对外部库调用的结果。

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

有没有人知道为什么我目前不能按照我想要的方式调试库?任何建议如何我可以?

回答

9

您必须选择调试器的那种当你连接。请注意对话框中的“附加到”标签。按下Select按钮并勾选“Native”以获得对调试本机代码的支持。在你的任何断点可以命中之前,DLL也需要被加载。如果您不确定是否已经完成,请在Debug> Windows> Modules debugger窗口中查看加载的DLL。只要调试器看到DLL加载并设置断点,断点指示器便会从空心变为红色。

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

,考虑你本地项目的调试选项,你可以指定一个EXE启动。所以你可以简单地按下F5开始调试并跳过附加的麻烦。

+0

非常感谢您的回答。就是这样。我从来没有意识到有不同类型的调试器。 – Drewmate 2012-04-18 20:30:56

3

它也可能与调试类型做! (但是这取决于您的具体建筑结构,对此,我不知道够不够)如果您的项目与公共语言运行库支持(/ CLR),你应该设置在启动项目的调试器类型符合

“混合”,因为默认设置“自动”可能会失败!

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

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

2)一个C++项目,它生成mylibrary.dll,它与Common Language Runtime Support一起编译,因为它使用了一些托管代码。第一个项目的.exe文件调用mylibrary.dll。

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

因此,将项目属性 - >配置属性 - >调试 - >调试器类型设置为“混合”!