5

我尝试用 Xcode 4.5 调试 c++ 代码,用 llvm 4.1 编译。代码非常简单,只需将几个项目插入到地图中。

当我跳过 STL 函数时,执行会在 STL 代码中停止,而不是像往常一样执行该步骤。

当我使用 LLVM-GCC 4.2 编译时,调试很好,但是这个编译器不支持 C++11。

以前有没有人遇到过这个问题,并且知道是否可以解决?

4

2 回答 2

2

Xcode 4.5.x 中的 lldb 不支持单步执行内联函数。C++11 标准库即使在 -O0 时也具有激进的函数内联,所以这个问题尤其明显。内联步进支持已被添加到 lldb, v. http://llvm.org/viewvc/llvm-project?view=rev&revision=163044并可在http://lldb.llvm.org/的源代码中使用但是您将无法用这些源代码替换 Xcode 中的 lldb(自 4.5 发布以来,API 已更改)。

请注意,单步执行内联函数(使它们在您在调试器中工作时看起来是“真实”函数)是一项复杂的功能,并且由 clang 生成的调试信息中的任何不准确都可能导致错误的单步行为。由于调试信息不​​足或 lldb 中的错误,存在(并且仍然会存在)无法正常工作的极端情况——这很难做到 100% 正确。

您可以尝试通过放置来减少 C++11 std lib 编程的麻烦

settings set target.process.thread.step-avoid-regexp ^[^ ]+ std::|^std::

在你的~/.lldbinit文件中。我认为这对内联函数没有帮助,但如果对 stdlib 方法的调用不合时宜,它至少会跳过它。

于 2012-11-04T00:39:31.057 回答
2

自从 LLDB 被引入 Xcode 以来,我当然会遇到同样的问题。似乎它不能正确处理内联函数的单步处理(请参阅:尝试退出 C++11 标准库时调试器会更深入)。

我刚刚向 Apple 提交了一份错误报告(ID 12588579),但我猜在 LLDB 完全准备好在 C++11 生产代码中使用之前需要进行几次迭代(它已经到了那里,记住发布的版本Xcode 在 4.4 之前根本无法使用)。

于 2012-10-28T08:29:24.540 回答