【问题标题】:How can I store "image lookup -v address" result inside a variable?如何将“图像查找 -v 地址”结果存储在变量中?
【发布时间】:2021-01-05 12:03:29
【问题描述】:

我可以通过以下 lldb 命令来表示符号地址:

image lookup --address $SYMBOL_ADDRRESS

但是在编写一个 shell 脚本进行解析时,我无法找到将上述命令的输出存储到变量或文件中的方法。

【问题讨论】:

    标签: shell lldb symbolicatecrash


    【解决方案1】:

    首先,如果您的脚本的工作主要是驱动 lldb 并且您碰巧了解 Python,那么使用 Python 中的 lldb 模块(您可以直接驱动调试器)会比让 lldb 生成文本输出更快乐你在 shell 脚本中解析。

    lldb Python 模块提供类似于 SBTarget.ResolveSymbolContextForAddress 的 API,它运行与 image lookup --address 相同的查找,但将结果作为 Python lldb.SBSymbolContext 对象返回,您可以使用 API 查询模块/文件/行等物体。因此,使用 lldd API 可以更轻松地从此结果中获取一些信息。

    但是,如果您必须使用 shell 脚本,那么最简单的方法可能是将命令输出写入文件并将其读回 shell 脚本。 lldb 还没有对将命令输出到日志文件的通用支持,但是 lldb Python 模块允许您运行命令行命令并以编程方式捕获输出。

    所以你可以通过 lldb 的 Python 脚本解释器轻松完成:

    (lldb) script
    Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.
    >>> result = lldb.SBCommandReturnObject()
    >>> lldb.debugger.GetCommandInterpreter().HandleCommand("image lookup -va $pc", result)
    2
    >>> fh = open("/tmp/out.txt", "w")
    >>> fh.write(result.GetOutput())
    >>> fh.close()
    >>> quit
    (lldb) plat shell cat /tmp/out.txt
          Address: foo[0x0000000100003f6f] (foo.__TEXT.__text + 15)
          Summary: foo`main + 15 at foo.c:6:3
           Module: file = "/tmp/foo", arch = "x86_64"
      CompileUnit: id = {0x00000000}, file = "/tmp/foo.c", language = "c99"
         Function: id = {0x7fffffff00000032}, name = "main", range = [0x0000000100003f60-0x0000000100003f8a)
         FuncType: id = {0x7fffffff00000032}, byte-size = 0, decl = foo.c:4, compiler_type = "int (void)"
           Blocks: id = {0x7fffffff00000032}, range = [0x100003f60-0x100003f8a)
        LineEntry: [0x0000000100003f6f-0x0000000100003f82): /tmp/foo.c:6:3
           Symbol: id = {0x00000005}, range = [0x0000000100003f60-0x0000000100003f8a), name="main"
    

    你也可以用 Python 写一个 lldb 命令来包装这部分业务,这样会更容易使用。详细信息在这里:

    https://lldb.llvm.org/use/python-reference.html#create-a-new-lldb-command-using-a-python-function

    您甚至可以使用混合方法,并让所有 lldb 工作您想要执行自定义 Python 命令。这将允许您使用 lldb Python API 来获取您需要的信息并以您方便的任何格式将其写出,并将简化您的 shell 脚本中的 lldb 调用并有助于恢复 lldb 提供的信息...

    【讨论】:

    • 谢谢,我会检查一下。
    猜你喜欢
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 2011-02-11
    • 2022-01-25
    • 2014-04-24
    • 2019-12-29
    • 2010-10-17
    • 2011-07-15
    相关资源
    最近更新 更多