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.