У меня есть очень полезный макрос, определенный в .gdbinit
define rc
call (int)[$arg0 retainCount]
end
Можно ли как-то определить тот же макрос для lldb?
У меня есть очень полезный макрос, определенный в .gdbinit
define rc
call (int)[$arg0 retainCount]
end
Можно ли как-то определить тот же макрос для lldb?
Вы можете сделать это с помощью следующего определения команды в lldb:
command regex rc 's/(.+)/print (int)[%1 retainCount]/'
Пример:
(lldb) rc indexPath
print (int)[indexPath retainCount]
(int) $2 = 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 *) $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, и armv7 передают первые «несколько» целочисленных значений в регистры — помимо этого они могут храниться в стеке или других местах, и эти псевдонимы не работают. В настоящее время lldb не предоставляет подобных удобных псевдонимов для аргументов с плавающей запятой. Но для наиболее распространенных случаев это покрывает то, что нужно людям.
-retainCount
работает нормально. - person bioffe   schedule 31.08.2012retainCount
, который не может быть лучше — точнее — реализован с помощью других инструментов. Учитывая, чтоretainCount
не отражает ни состояние автоматического выпуска, ни состояние потока, со временем он становится менее полезным. - person bbum   schedule 31.08.2012