如何在Xcode的调用栈中隐藏第三方调用

Mar*_*rty 8 xcode realm lldb rx-swift

当我使用 Realm 或 RxSwift 并且出现异常时,我会得到这些我不关心的巨大调用堆栈,并且必须找到一两行是我的代码。我只想在调用堆栈上显示来自目标运行中的符号,而不是链接库。我怎样才能隐藏这些?

在此处输入图片说明

Dav*_*Lee 16

我不知道有什么方法可以过滤 Xcode 显示的内容,但您可能会发现 lldb 的 Python 脚本很有帮助。至少有三种可能的方法来过滤堆栈:

  1. 框架名称
  2. 图书馆
  3. 源路径

首先,要按名称过滤堆栈,可以使用正则表达式来检查函数名称。正则表达式可以匹配您要删除的帧,也可以匹配您要保留的帧。从给定的堆栈跟踪中,我无法确定您要保留哪些,因此我将演示如何删除 Realm 框架:

(lldb) script
import re
for frame in lldb.thread:
    if not re.search("[Rr]ealm|RLM", frame.name):
        print(f"{frame.idx}: {frame.name}")
Run Code Online (Sandbox Code Playgroud)

按函数名称匹配并不总是理想的,它可能是一个很长或复杂的正则表达式。如果要过滤的库恰好是动态库或框架,那么最简单的方法是按“模块”过滤:

(lldb) script
for frame in lldb.thread:
    if frame.module.file.basename != "Realm":
        print(f"{frame.idx}: {frame.name}")
Run Code Online (Sandbox Code Playgroud)

第三个选项是按与每个帧关联的源路径进行过滤。我不知道这对 Realm 有用(这取决于调试信息),但我已经用 RxSwift 做到了。在此示例中,RxSwift/不会打印源路径中包含的帧:

(lldb) script
for frame in lldb.thread:
    if "RxSwift/" not in frame.line_entry.file.fullpath:
        print(f"{frame.idx}: {frame.name}")
Run Code Online (Sandbox Code Playgroud)

可重用命令

这些方法可以结合起来制作适合您项目的堆栈跟踪命令。要执行该命令,请将您的自定义for循环放入一个文件中,然后从您的~/.lldbinit

command script import path/to/mystack.py
Run Code Online (Sandbox Code Playgroud)

编写 lldb 命令时,需要进行一些更改。这是一个结合了上述两种方法的示例:

command script import path/to/mystack.py
Run Code Online (Sandbox Code Playgroud)