Shell 我怎样才能储存;图像查找-v地址“;变量内部的结果?

Shell 我怎样才能储存;图像查找-v地址“;变量内部的结果?,shell,lldb,symbolicatecrash,Shell,Lldb,Symbolicatecrash,我能够通过以下lldb命令对符号地址进行符号化: 图像查找--地址$SYMBOL\u ADDRRESS 但是,在编写要解析的shell脚本时,我无法找到将上述命令的输出存储到变量或文件中的方法。首先,如果您的脚本主要是关于驱动lldb的,并且您碰巧了解Python,那么使用Python中的lldb模块您会更高兴,因为您可以直接驱动调试器,而不是让lldb生成在shell脚本中解析的文本输出 lldb Python模块提供类似于SBTarget.ResolveSymbolContextForAdd

我能够通过以下lldb命令对符号地址进行符号化:

图像查找--地址$SYMBOL\u ADDRRESS


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

首先,如果您的脚本主要是关于驱动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命令来包装这项业务,这将使它更易于使用。详情如下:


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

首先,如果脚本的工作主要是驱动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命令来包装这项业务,这将使它更易于使用。详情如下:


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

谢谢,我会检查这个。谢谢,我会检查这个。