2013-10-04 10 views
11

Sto usando lldb all'interno di Xcode e una delle mie variabili contiene un enorme frammento di dati JSON. L'utilizzo di po myVar non è molto utile per analizzare questi dati, poiché verrà emesso nella minuscola console di debug di Xcode.Reindirizzare l'output lldb sul file

C'è un modo per reindirizzare l'output di lldb in un file?

vidi here che tale caratteristica sembra essere disponibile sul gdb come:

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

ed è "tradotta" in lldb come:

(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 

Tuttavia, il comando memory read no aiuto nel mio caso, e --outfile non sembra essere disponibile per il comando print.

risposta

11

È possibile utilizzare uno script Python per farlo (e molto altro), come spiegato qui:

LLDB Python scripting in Xcode

Creare un file denominato po.py in una cartella a vostra scelta (ad esempio "~ /.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 ') 

Poi nella console di debug di scrittura:

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

Miglioramenti qui: perché non fare il comando un argomento - allora potresti dire "print_to_file po self"? Inoltre, non ho controllato se LLDB ripristini automaticamente gli handle per te, ma sembrerebbe una buona pratica reimpostare l'handle del file di output :) Infine, puoi semplicemente recuperare SBCommandReturnObject per il "comando inferiore" (po self nel esempio) e scriverlo su un file invece di dirottare lo stdout di lldb. In genere, sarei diffidente nel cercare di giocare con lo stdin/stdout se evitabile del tutto. –

+2

C'è un modo per reindirizzare l'output * all * debugger su un file? Ho provato lo script precedente senza la riga 'HandleCommand' e non ha funzionato. – blackwing

+1

Enrico, potresti considerare di mostrare un tuo esempio/risposta che migliora su questo? Mi piace il suono del tuo approccio, ma non ho abbastanza informazioni per testarlo. – insitusec

0

Ecco una leggera modifica che incorpora alcune delle osservazioni dall'alto:

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) 

Questo permette il comando da fornire come argomento, e ritorna l'handle di file di output stdout dopo il comando viene eseguito.