Перенаправить вывод lldb в файл

Я использую lldb внутри Xcode, и одна из моих переменных содержит огромный кусок данных 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.

Ответ 1

Вы можете использовать Python script для этого (и многое другое), как описано здесь:

LLDB скрипты Python в Xcode

Создайте файл с именем 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 ')

Затем в консоли отладки напишите:

comma script import ~/.lldb/po.py
print_to_file

Ответ 2

Вот небольшая модификация, включающая некоторые из комментариев сверху:

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)

Это позволяет команде поставляться в качестве аргумента и возвращает дескриптор выходного файла в stdout после выполнения команды.

Ответ 3

Я создал Python script, который использует memory read, а затем обрабатывает вывод, чтобы преобразовать его в нужный мне формат (в моем случае одно значение для каждой строки): https://gist.github.com/aleph7/96ec9b3c5df60a07b216