2013-10-04 12 views
11

Używam lldb wewnątrz Xcode, a jedna z moich zmiennych zawiera ogromną porcję danych JSON. Używanie po myVar nie jest zbyt pomocne w analizowaniu tych danych, ponieważ będzie wyprowadzane w maleńkiej konsoli do debugowania Xcode.Przekierowanie wyjścia lldb do pliku

Czy istnieje sposób przekierowania wyjścia Lldb do pliku?

Widziałem here, że taka funkcja wydaje się być dostępny na gdb jak:

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

i "przetłumaczone" w lldb jak:

(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 

Jednak komenda memory read nie będzie pomoc w moim przypadku i --outfile nie wydają się być dostępne dla polecenia print.

Odpowiedz

11

Można użyć skryptu Pythona, aby to zrobić (i wiele innych), jak wyjaśniono tutaj:

LLDB Python scripting in Xcode

Utwórz plik o nazwie po.py w katalogu wyboru (na przykład „~ /.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 ') 

Następnie w konsoli debugowania zapisu:

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

Ulepszenia tutaj: dlaczego nie zrobić polecenie argument - wtedy możesz powiedzieć "print_to_file po self"? Ponadto, nie sprawdziłem, czy LLDB automagicznie resetuje uchwyty dla ciebie, ale dobrym rozwiązaniem byłoby zresetowanie uchwytu pliku wyjściowego :) Wreszcie, możesz po prostu pobrać obiekt SBCommandReturnObject dla "gorszego polecenia" (po self w przykład) i zapisz go w pliku zamiast przejąć kontrolę nad stdoutem Lldb. Generalnie bym się starał grać z stdin/stdout, jeśli w ogóle można tego uniknąć. –

+2

Czy istnieje sposób przekierowania * wszystkich * danych wyjściowych debuggera do pliku? Próbowałem powyższego skryptu bez linii 'HandleCommand' i to nie działało. – blackwing

+1

Enrico, czy mógłbyś pokazać swój własny przykład/odpowiedź, który ulepszy ten? Podoba mi się brzmienie twojego podejścia, ale nie mam wystarczających informacji, aby go przetestować. – insitusec

0

Oto niewielka modyfikacja zawierające niektóre z komentarzy powyżej:

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) 

Pozwala to polecenie, które należy dostarczyć jako argument i powraca uchwyt pliku wyjściowego do stdout po komenda jest wykonywana.

Powiązane problemy