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

Posted

技术标签:

【中文标题】有没有办法从 Xcode 调试器的调用堆栈中删除内联函数?【英文标题】:Is there a way to remove inlined functions from the call stack in the Xcode debugger? 【发布时间】:2013-02-15 13:21:00 【问题描述】:

我知道最新版本的 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 的情况下无济于事。

【讨论】:

偶尔的“越过”错误不会打扰我。我更关心尝试调试我的递归代码......我想我要求的是一种考虑所有调试信息但只是过滤掉内联帧并始终自动跳过内联代码的模式(停止当到达真正的函数调用时)。 啊,好吧,我想我明白你的意思了。您正在通过 vector.push_back 之类的东西执行 step 并且您不想实际进入它的内联实现。您可以尝试使用target.process.thread.step-avoid-regexp 设置,如~/.lldbinit 文件中的settings set target.process.thread.step-avoid-regexp ^[^ ]+ std::|^std::

以上是关于有没有办法从 Xcode 调试器的调用堆栈中删除内联函数?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 4.2 调试不象征堆栈调用

当我们在 Xcode 中执行程序时,有没有办法查看函数调用的顺序?

Jetbrains Rider:在调试器调用堆栈中显示“外部代码”

“ [轻量功能]在调用堆栈中

从 Xcode 视图调试中找出视图代码的位置

如何查看xcode调用堆栈