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.
Grazie! Informazioni molto utili per iniziare. – benwad
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
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ò. :( –