2013-02-15 35 views
0

我知道最近版本的Xcode显示了内联函数,并允许在内联代码中进行步进。我试图调试大量使用std :: function的代码,我真的更喜欢如果调用堆栈和step-in操作都会直接跳过std :: function的所有实现细节。新的libC++用属性“always_inline”标记这些细节,以便它们总是内联(即使在调试版本中),这正是我想要的。实际上,由于我没有调试std :: function的实现,我只是不想看到这些函数...有没有办法从Xcode调试器中的调用堆栈中删除内联函数?

回答

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编写一个stack walker,它的功能与真正的bt相同,但跳过了内联框架 - SBFrame::IsInlined()方法使得这一点变得简单。但是这对你使用Xcode的情况没有帮助。

+0

ocasional“跨越”错误不会打扰我。我更关心的是试图调试我的递归代码......我想我所要求的是一种考虑所有调试信息的模式,但它只是简单地过滤出内联框架,并且总是自动跨越内联代码(停止当达到真正的函数调用时)。 – alexk7 2013-02-16 16:05:41

+0

啊,好吧,我想我明白你的意思了。你正在为'vector.push_back'做一些''步骤',而你不想实际进入内联的实现。您可以尝试使用'target.process.thread.step-avoid-regexp'设置,例如'settings set target.process.thread.step-avoid-regexp^[^] + std :: |^std ::'in你的'〜/ .lldbinit'文件。 – 2013-02-18 10:10:19

相关问题