/ / LLDB Python scripting en Xcode - python, xcode, scripting, lldb

LLDB Python scripting en Xcode - python, xcode, scripting, lldb

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 № 1

Desafortunadamente, 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.