Lldb эквивалент макросов GDB
у меня есть очень полезный макрос, определенный в .gdbinit
define rc
call (int)[$arg0 retainCount]
end
есть в любом случае, чтобы определить тот же макрос для символы отладки ?
2 ответов
вы можете сделать это со следующим определением команды в lldb:
command regex rc 's/(.+)/print (int)[%1 retainCount]/'
пример:
(lldb) rc indexPath
print (int)[indexPath retainCount]
(int) = 2
вы можете поместить это в ~/.lldbinit
(и перезапустите Xcode).
надо думать, что что-то вроде
command alias rc print (int)[%1 retainCount]
должно работать, но как объяснили в я не могу заставить этот простой псевдоним LLDB работать расширение %1 не работает с выражением, и command regex
- это временное решение.
кстати, на архитектурах, где аргументы функции передаются в регистрах (x86_64, armv7), lldb определяет ряд псевдонимов регистров, которые сопоставляются регистру, используемому для передачи интегральных значений -- arg1, arg2 и т. д. Например,
#include <stdio.h>
int main ()
{
char *mytext = "hello world\n";
puts (mytext);
return 0;
}
и мы можем легко увидеть, какой аргумент передается в puts без необходимости помнить соглашения ABI,
4 char *mytext = "hello world\n";
-> 5 puts (mytext);
6 return 0;
7 }
(lldb) p mytext
(char *) = 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 , %rsp
(lldb) p/x $arg1
(unsigned long) = 0x0000000100000f54
(lldb)
x86_64 и armv7 оба передают первые" немногие " интегральные значения в регистрах-за этим они могут хранятся в стеке или в других местах и эти псевдонимы не работают. lldb в настоящее время не предоставляет аналогичные псевдонимы удобства для Аргументов с плавающей запятой. Но для самых распространенных случаев это то, что нужно людям.