2013-10-04 3 views
11

Я использую lldb внутри Xcode, и одна из моих переменных содержит огромный кусок данных JSON. Использование po myVar не очень полезно для анализа этих данных, поскольку оно будет выводиться в крошечной консоли отладки Xcode.Перенаправить вывод lldb в файл

Есть ли способ перенаправить вывод lldb в файл?

Я видел here, что такая особенность, кажется, будет доступна на БГД как:

(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.

ответ

11

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

LLDB Python scripting in 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 
+1

Улучшения здесь: почему бы не сделать команду аргумент - то вы могли бы сказать «print_to_file po self»? Кроме того, я не проверял, автоматически ли LLDB сбрасывает дескрипторы для вас, но было бы неплохо сбросить дескриптор выходного файла. Наконец, вы могли бы просто извлечь SBCommandReturnObject для «нижней команды» (po self в пример) и записать его в файл вместо захвата stldout lldb. Я, как правило, опасаюсь пытаться играть со stdin/stdout, если вообще избежать. –

+2

Есть ли способ перенаправить вывод * all * debugger в файл? Я попробовал вышеуказанный скрипт без строки 'HandleCommand', и это не сработало. – blackwing

+1

Enrico, не могли бы вы предложить пример/ответ, который улучшится после этого? Мне нравится звук вашего подхода, но у меня недостаточно информации, чтобы проверить его. – insitusec

0

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

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) 

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

0

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

Смежные вопросы