我知道最新版本的 Xcode 显示内联函数并允许步入内联代码。我正在尝试调试大量使用 std::function 的代码,如果调用堆栈和步入操作都只是跳过 std::function 的所有实现细节,我真的更喜欢。新的 libc++ 用属性“always_inline”标记这些细节,以便它们总是内联(即使在调试版本中),这正是我想要的。事实上,由于我没有调试 std::function 实现,我只是不想看到这些函数......
1 回答
你现在不能这样做。您可以更改 lldb 在回溯中报告堆栈帧的方式 - 请参阅http://lldb.llvm.org/formats.html - 但我想不出任何方法来抑制(合成的)内联堆栈回溯中的帧。gdb 有一个设置来避免解析调试信息中的所有内联信息 - 没有步进,没有回溯 - 但尚未添加到 lldb。
实际上,您真的不想关闭内联代码支持步进。在不识别内联代码的情况下,“下一个”或“跳过”单步模式会因内联代码而严重中断。Xcode 4.6 在这方面做得很好——但剩下的情况是你“跨过”带有内联代码的源代码行,并且你从.h
文件中看到实际的内联实现是因为编译器的调试信息不正确。正确获取此调试信息很棘手,虽然其中大部分是正确的,但有时您仍会在 Xcode 4.6 中使用内联方法。可能对于您正在使用的容器,您经常遇到这种情况 - 但这不是常见的情况。
lldb 确实为您提供了一种自定义输出的方法bt
,请参阅http://lldb.llvm.org/formats.html,但没有办法让它抑制内联堆栈帧。您可以很容易地在 python 中编写一个堆栈遍历器,它与真实的执行相同的操作bt
但跳过内联帧 - 该SBFrame::IsInlined()
方法使这变得简单。但这在您使用 Xcode 的情况下无济于事。