Эквивалент LLDB макросов GDB

У меня есть очень полезный макрос, определенный в .gdbinit

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

Можно ли как-то определить тот же макрос для lldb?


person bioffe    schedule 30.08.2012    source источник
comment
continueCount бесполезен (просто напоминание)   -  person bbum    schedule 31.08.2012
comment
@bbum, почему бы вам тогда не отказаться от SDK? Каждый имеет право на собственное мнение. Я не использую ARC (по крайней мере, пока не будут исправлены его основные ошибки). Я управляю своей памятью, когда могу. Для этого -retainCount работает нормально.   -  person bioffe    schedule 31.08.2012
comment
Он фактически устарел, поскольку больше не используется в ARC, что является рекомендуемым шаблоном в будущем. Мне еще предстоит увидеть шаблон использования с retainCount, который не может быть лучше — точнее — реализован с помощью других инструментов. Учитывая, что retainCount не отражает ни состояние автоматического выпуска, ни состояние потока, со временем он становится менее полезным.   -  person bbum    schedule 31.08.2012


Ответы (2)


Вы можете сделать это с помощью следующего определения команды в 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 является обходным путем.

person Martin R    schedule 30.08.2012
comment
Я тоже пытался использовать «псевдоним команды», но у меня это не сработало. Ваше решение работает. Спасибо большое. Я хочу посмотреть, могут ли другие предложить более простое решение. Если такого решения нет, я отмечу ваш ответ принятым. - person bioffe; 31.08.2012

Между прочим, в архитектурах, где аргументы функций передаются в регистрах (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 не предоставляет подобных удобных псевдонимов для аргументов с плавающей запятой. Но для наиболее распространенных случаев это покрывает то, что нужно людям.

person Jason Molenda    schedule 23.09.2012