【发布时间】:2021-01-05 12:03:29
【问题描述】:
我可以通过以下 lldb 命令来表示符号地址:
image lookup --address $SYMBOL_ADDRRESS
但是在编写一个 shell 脚本进行解析时,我无法找到将上述命令的输出存储到变量或文件中的方法。
【问题讨论】:
标签: shell lldb symbolicatecrash
我可以通过以下 lldb 命令来表示符号地址:
image lookup --address $SYMBOL_ADDRRESS
但是在编写一个 shell 脚本进行解析时,我无法找到将上述命令的输出存储到变量或文件中的方法。
【问题讨论】:
标签: shell lldb symbolicatecrash
首先,如果您的脚本的工作主要是驱动 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 提供的信息...
【讨论】: