5

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

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

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

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

另一个复杂的因素是这个项目不是由 Visual Studio 构建的。它是使用一个使用cl.

有谁知道为什么我目前不能按照我想要的方式调试库?关于我怎么做的任何建议?

4

2 回答 2

11

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

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

并考虑您本机项目中的调试选项,您可以指定一个 EXE 来启动。这样您就可以简单地按 F5 开始调试并跳过附加麻烦。

于 2012-04-18T20:06:21.273 回答
3

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

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

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

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

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

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

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

于 2012-11-22T15:21:38.990 回答