Acabo de descubrir esta característica útil de LLDB que me permite escribirLos scripts de Python que tienen acceso a las variables en el marco cuando estoy en un punto de interrupción en LLDB. Sin embargo, tengo algunos problemas al usarlo en Xcode (v4.5.2). En primer lugar, no puedo encontrar ningún lugar que indique dónde debo guardar estas secuencias de comandos de Python para poder importarlas desde la línea de comandos en LLDB. En segundo lugar, después de escribir script
en LLDB, la entrada del teclado va un poco mal: el retroceso no elimina el carácter en la pantalla, pero sí lo elimina del comando. Así que, al escribir primt<bsp><bsp><bsp>int
significa efectivamente print
, pero sigue apareciendo como primtint
en la terminal Esto es solo estético pero es bastante molesto!
¿Alguien puede indicarme algunos recursos específicos de Xcode para usar Python con LLDB?
EDITAR: aquí es otro enlace interesante que dice que puedes usar Python para crear resúmenes personalizados para variables que usan Python, pero no puedo encontrar nada relacionado con eso.
Respuestas
13 para la respuesta № 1Desafortunadamente, entre Xcode, lldb y el intérprete de Python hay algunos problemas con la consola interactiva. Por favor, haga un informe de error en http://bugreport.apple.com/ - No sé si hay un informe de error sobreEste problema específico ya, aunque aquí se conocen problemas en general. Es posible que desee utilizar la herramienta lldb de la línea de comandos si está explorando la interfaz interactiva de scripts de Python; eso funciona mejor.
Puse todos mis scripts de python para lldb en ~/lldb
. En mi ~/.lldbinit
archivo en el que los fuente. Por ejemplo, tengo ~/lldb/stopifcaller.py
cual es
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()
Yo pondria el command script import
en mi ~/.lldbinit
archivo para cargarlo automáticamente, si eso es lo que yoquerido. Este ejemplo en particular agrega un comando de python al punto de interrupción n.º 1: cuando lldb se detiene en el punto de interrupción, observará la función de llamada. Si la función de llamada no es foo
, se reanudará automáticamente la ejecución. En esencia, el punto de interrupción 1 solo se detendrá si foo () llama a la barra (). Tenga en cuenta que puede haber un problema con Xcode 4.5 lldb al hacer command script import ~/...
- Es posible que deba escribir la ruta completa a su directorio de inicio (/Users/benwad/
o lo que sea). No puedo recordarlo con seguridad: hubo algunos problemas de expansión de tilde con Xcode 4.5 que se han solucionado por un tiempo.
Puede agregar resúmenes de tipo simple a su ~/.lldbinit
directamente. Por ejemplo, si estoy "depurando lldb" ConstString
los objetos solo tienen un campo de interés para mí normalmente, el m_string ivar. Así que tengo
type summary add -w lldb lldb_private::ConstString -s "${var.m_string}"
O si es el tipo addr_t
, Siempre quiero que el formato sea hexadecimal así que tengo
type format add -f x lldb::addr_t
Si desea agregar un nuevo comando a lldb, tendría un archivo de python como ~/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")
y lo cargarías en lldb like
(lldb) comma script import ~/lldb/sayhello.py
(lldb) hello
hello
(lldb)
La mayoría de las veces, cuando agregue un comando escrito en python, utilizará el comando shlex
y optparse
bibliotecas para que el comando pueda realizar el análisis de opciones, y usted agregará una __doc__
cadena - omití esas cosas para mantener el ejemplo simple.