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