objective-c gdb lldb

objective-c - gdb vs lldb



LLDB equivalente a las macros de GDB (2)

Tengo una macro muy útil definida en .gdbinit

define rc call (int)[$arg0 retainCount] end

¿Hay alguna forma de definir la misma macro para lldb ?


Por cierto, en arquitecturas donde los argumentos de funciones se pasan en registros (x86_64, armv7), lldb define una serie de alias de registro que se correlacionan con el registro utilizado para pasar los valores integrales - arg1, arg2, etc. Por ejemplo,

#include <stdio.h> int main () { char *mytext = "hello world/n"; puts (mytext); return 0; }

y podemos ver fácilmente qué argumento se pasa a poner sin tener que recordar las convenciones de ABI,

4 char *mytext = "hello world/n"; -> 5 puts (mytext); 6 return 0; 7 } (lldb) p mytext (char *) $0 = 0x0000000100000f54 "hello world/n" (lldb) br se -n puts Breakpoint created: 2: name = ''puts'', locations = 1, resolved = 1 (lldb) c Process 2325 resuming Process 2325 stopped libsystem_c.dylib`puts: -> 0x7fff99ce1d9a: pushq %rbp 0x7fff99ce1d9b: movq %rsp, %rbp 0x7fff99ce1d9e: pushq %rbx 0x7fff99ce1d9f: subq $56, %rsp (lldb) p/x $arg1 (unsigned long) $2 = 0x0000000100000f54 (lldb)

x86_64 y armv7 pasan los primeros "pocos" valores integrales en los registros; más allá de eso, pueden almacenarse en la pila u otros lugares y estos alias no funcionan. lldb actualmente no proporciona alias de conveniencia similares para argumentos de coma flotante. Pero para los casos más comunes, esto cubre lo que las personas necesitan.


Puede hacerlo con la siguiente definición de comando en lldb:

command regex rc ''s/(.+)/print (int)[%1 retainCount]/''

Ejemplo:

(lldb) rc indexPath print (int)[indexPath retainCount] (int) $2 = 2

Puedes poner eso en ~/.lldbinit (y reiniciar Xcode).

Uno debería pensar que algo así como

command alias rc print (int)[%1 retainCount]

debería funcionar, pero como se explica en No puedo hacer que funcione este alias simple de LLDB, la expansión% 1 no funciona con la expresión, y el command regex es una solución alternativa.