2013-01-09 7 views
5

Ho appena scoperto la pratica funzionalità di LLDB this che consente di scrivere script Python che hanno accesso alle variabili nel frame quando sono su un punto di interruzione in LLDB. Tuttavia ho alcuni problemi quando lo uso in Xcode (v4.5.2). In primo luogo, non riesco a trovare da nessuna parte che dice dove dovrei mantenere questi script Python in modo da poterli importare dalla riga di comando in LLDB. In secondo luogo, dopo aver digitato script in LLDB, l'input della tastiera è un po 'errato: backspace non cancella il carattere sullo schermo, ma lo elimina efficacemente dal comando. Quindi digitare primt<bsp><bsp><bsp>int significa efficacemente print, ma viene comunque visualizzato come primtint sul terminale. Questo è solo estetico ma è abbastanza fastidioso!LLDB Script Python in Xcode

Qualcuno può indicarmi alcune risorse specifiche per Xcode per l'utilizzo di Python con LLDB?

EDIT: Here è un altro collegamento interessante che dice che è possibile utilizzare Python per creare riepiloghi personalizzati per variabili usando Python, ma non riesco a trovare nulla di simile.

risposta

13

Tra Xcode, lldb e l'interprete Python ci sono alcuni problemi con la console interattiva, sfortunatamente. Si prega di fare una segnalazione di bug a http://bugreport.apple.com/ - Non so se c'è già una segnalazione di bug su questo problema specifico, anche se i problemi in generale qui sono noti. Potresti voler usare lo strumento lldb della riga di comando se stai esplorando l'interfaccia di scripting python interattiva; funziona meglio

Ho messo tutti i miei script Python per lldb in ~/lldb. Nel mio file ~/.lldbinit li ho di origine. Ad esempio, ho ~/lldb/stopifcaller.py che è

import lldb 

# Use this like 
# (lldb) command script import ~/lldb/stopifcaller.py 
# (lldb) br s -n bar 
# (lldb) br comm add --script-type python -o "stopifcaller.stop_if_caller(frame, 'foo')" 1 

def stop_if_caller(current_frame, function_of_interest): 
    thread = current_frame.GetThread() 
    if thread.GetNumFrames() > 1: 
    if thread.GetFrameAtIndex(1).GetFunctionName() != function_of_interest: 
     thread.GetProcess().Continue() 

avrei messo la command script import nel mio file ~/.lldbinit per caricare automaticamente, se è questo quello che volevo. Questo particolare esempio aggiunge un comando python al punto di interruzione n. 1: quando lldb si arresta nel punto di interruzione, verrà esaminata la funzione di chiamata. Se la funzione di chiamata non è foo, riprenderà automaticamente l'esecuzione. In sostanza, breakpoint 1 si fermerà solo se foo() chiama bar(). Si noti che potrebbe esserci un problema con Xcode 4.5 lldb nel fare command script import ~/... - potrebbe essere necessario digitare il percorso completo della directory home (/Users/benwad/ o qualsiasi altra cosa). Non ricordo per certo - ci sono stati alcuni problemi di espansione delle tilde con Xcode 4.5 che sono stati risolti per un po '.

È possibile aggiungere direttamente riepiloghi di tipi semplici al proprio ~/.lldbinit. Ad esempio, se eseguo il debug di lldb in sé, gli oggetti ConstString hanno solo un campo di interesse per me normalmente, il m_string ivar.Così ho

type summary add -w lldb lldb_private::ConstString -s "${var.m_string}" 

O se è il tipo addr_t, voglio sempre che formattato come esadecimale quindi devo

type format add -f x lldb::addr_t 

Se si desidera aggiungere un nuovo comando per lldb, si avrebbe un pitone di file come ~/lldb/sayhello.py,

import lldb 

def say_hello(debugger, command, result, dict): 
    print 'hello' 

def __lldb_init_module (debugger, dict): 
    debugger.HandleCommand('command script add -f sayhello.say_hello hello') 

e si sarebbe caricarlo per lldb come

(lldb) comma script import ~/lldb/sayhello.py 
(lldb) hello 
hello 
(lldb) 

La maggior parte del tempo in cui si aggiunge un comando scritto in python che userete le librerie shlex e optparse in modo che il comando può fare l'analisi delle opzioni, e si aggiungerà una stringa __doc__ - ho omesso quelle cose da tenere l'esempio semplice.

+0

Grazie! Informazioni molto utili per iniziare. – benwad

+0

Non si dispone di un repository Github con i frammenti 'lldb'' python', vero? (Ho guardato e non ne ho visto uno ... voglia di iniziarne uno?) Penso che sia molto interessante. – trojanfoe

+5

Penso che abbiamo davvero bisogno di aggiungere un documento in stile libro di ricette al sito web lldb con una raccolta di problemi semplici e le loro soluzioni - che probabilmente sarebbe il posto migliore per questo genere di cose. Mancanza di tempo però. :( –