有没有办法从Xcode调试器中的调用堆栈中删除内联函数?

时间:2013-02-15 13:21:00

标签: c++ xcode lldb

我知道Xcode的最新版本显示了内联函数,并允许单步执行内联代码。我正在尝试调试大量使用std :: function的代码,如果调用堆栈和步入操作都只是跳过std :: function的所有实现细节,我真的更喜欢。新的libc ++使用属性“always_inline”标记这些细节,以便它们始终内联(即使在调试版本中),这正是我想要的。事实上,由于我没有调试std :: function实现,我只是不想看到这些函数......

1 个答案:

答案 0 :(得分:2)

你现在不能这样做。您可以更改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中编写一个堆栈walker,与真正的bt做同样的事情,但跳过内联框架 - SBFrame::IsInlined()方法使这很简单。但是在你使用Xcode的情况下,这无济于事。