17

我在 Xcode 中使用 lldb,我的一个变量包含大量 JSON 数据。使用po myVar对分析这些数据没有多大帮助,因为它会在微型 Xcode 调试控制台中输出。

有没有办法将 lldb 输出重定向到文件?

我在这里看到gdb 上似乎有这样的功能:

(gdb) set logging on
(gdb) set logging file /tmp/mem.txt
(gdb) x/512bx 0xbffff3c0
(gdb) set logging off

并在 lldb 中“翻译”为:

(lldb) memory read --outfile /tmp/mem.txt --count 512 0xbffff3c0
(lldb) me r -o/tmp/mem.txt -c512 0xbffff3c0
(lldb) x/512bx -o/tmp/mem.txt 0xbffff3c0

但是,该memory read命令在我的情况下无济于事,并且显然--outfile不适用于该print命令。

4

3 回答 3

16

您可以使用 Python 脚本来执行此操作(以及更多),如下所述:

Xcode 中的 LLDB Python 脚本

在您选择的目录中创建一个名为 po.py 的文件(例如“~/.lldb”):

import lldb

def print_to_file(debugger, command, result, dict):
  #Change the output file to a path/name of your choice
  f=open("/Users/user/temp.txt","w")
  debugger.SetOutputFileHandle(f,True);
  #Change command to the command you want the output of
  command = "po self"
  debugger.HandleCommand(command)

def __lldb_init_module (debugger, dict):
  debugger.HandleCommand('command script add -f po.print_to_file print_to_file ')

然后在 lldb 中写入:

command script import ~/.lldb/po.py
print_to_file
于 2013-10-12T08:24:57.010 回答
1

下面是一个小小的修改,结合了上面的一些评论:

def toFile(debugger, command, result, dict):
    f=open("/Users/user/temp.txt","w")
    debugger.SetOutputFileHandle(f,True);
    debugger.HandleCommand(command)  
    f.close()
    debugger.SetOutputFileHandle(sys.stdout, True)

这允许将命令作为参数提供,并在命令运行后将输出文件句柄恢复为标准输出。

于 2015-06-10T15:57:55.583 回答
0

假设您有一个名为 jsonData 的变量(它具有 Data 类型),您可以使用以下命令将其保存到文件中:

expr jsonData.write(to: URL(fileURLWithPath: "/tmp/datadump.bin"))

或者,您可以将此变量使用的内存转储到文件中,而不是上面的命令,如下例所示:

(lldb) po jsonData
▿ Optional<Data>
  ▿ some : 32547 bytes
    - count : 32547
    ▿ pointer : 0x00007fe8b69bb410
      - pointerValue : 140637472797712

(lldb) memory read --force --binary --outfile /tmp/datadump.bin --count 32547 0x00007fe8b69bb410
32547 bytes written to '/tmp/datadump.bin'
于 2021-10-04T14:24:14.180 回答