gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:43:47 29 4
gpt4 key购买 nike

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

最佳答案

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

  • 车架名称
  • 图书馆
  • 源路径

  • 首先,要按名称过滤堆栈,可以使用正则表达式来检查函数名称。正则表达式可以匹配您要删除的帧,也可以匹配您要保留的帧。从给定的堆栈跟踪中,我无法判断您要保留哪些,因此我将演示如何删除 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}")
    按函数名称匹配并不总是理想的,它可能是一个长或复杂的正则表达式。如果您要过滤的库恰好是动态库或框架,那么最简单的方法是按“模块”过滤:
    (lldb) script
    for frame in lldb.thread:
    if frame.module.file.basename != "Realm":
    print(f"{frame.idx}: {frame.name}")
    第三个选项是按与每个帧关联的源路径进行过滤。我不知道这是否适用于 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}")
    可重用的命令
    可以组合这些方法来制作适合您项目的堆栈跟踪命令。要执行该命令,请将您的自定义 for循环进入一个文件,然后从你的 ~/.lldbinit 加载它:
    command script import path/to/mystack.py
    在编写 lldb 命令时,需要进行一些更改。这是一个结合上述两种方法的示例:
    import lldb
    import re

    REALM_PATTERN = re.compile("[Rr]ealm|RLM")

    @lldb.command()
    def mystack(debugger, command, ctx, result, _):
    for frame in ctx.thread:
    if not is_rx(frame) and not is_realm(frame):
    print(f"{frame.idx}: {frame.name}", file=result)

    def is_realm(frame):
    return REALM_PATTERN.search(frame.name)

    def is_rx(frame):
    return "RxSwift/" in frame.line_entry.file.fullpath

    关于xcode - Xcode中如何隐藏调用栈中的第三方调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62825950/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com