在使用Xcode 4.5调试c ++时,单步执行代码会停止在STL代码上

时间:2012-10-27 11:50:44

标签: c++ xcode debugging c++11 xcode4.5

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

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

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

之前是否有人遇到此问题,并知道是否可以修复?

2 个答案:

答案 0 :(得分:2)

自从LLDB被引入Xcode以来,我当然可以遇到同样的问题。它似乎无法正确处理内联函数(参见:Debugger steps deeper when trying to step out of C++11 std lib)。

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

答案 1 :(得分:2)

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

请注意,单步执行内联函数 - 使它们在调试器中工作时看起来像“真实”函数 - 是一个复杂的功能,并且clang生成的调试信息中的任何不准确都会导致错误的步进行为。由于调试信息不​​充分或者由于lldb中的错误而导致(并且仍将存在)无法正常工作的极端情况 - 这对于100%正确而言是非常棘手的。

你可以尝试通过添加

来减少C ++ 11 std lib编程的麻烦
settings set target.process.thread.step-avoid-regexp ^[^ ]+ std::|^std::

~/.lldbinit文件中。我不认为这对内联函数有帮助,但如果对stdlib方法的调用不合适,它至少会超越它。