Objective c 相当于GDB的LLDB';s宏

Objective c 相当于GDB的LLDB';s宏,objective-c,gdb,lldb,Objective C,Gdb,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 您可以将其放入~/.ll

我在
.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]

应该可以,但正如%1扩展中所解释的那样,表达式不能使用,
命令regex
是一种解决方法。

顺便说一句,在函数参数在寄存器(x86_64,armv7)中传递的体系结构上,lldb定义了一系列寄存器别名,这些别名映射到用于传递整数值的寄存器——arg1,arg2,比如,

#include <stdio.h>
int main ()
{
  char *mytext = "hello world\n";
  puts (mytext);
  return 0;
}

x86_64和armv7都在寄存器中传递第一个“少数”整数值——除此之外,它们可以存储在堆栈或其他位置,而这些别名不起作用。lldb目前没有为浮点参数提供类似的方便别名。但对于最常见的情况,这是人们所需要的。

我也尝试过使用“命令别名”这一概念,但它对我来说不起作用。你的解决方案有效。非常感谢你。我想看看其他人是否能提供更直接的解决方案。如果没有这样的解决方案,我会将您的答案标记为已接受。重新计数是无用的(只是一个提醒)@bbum那么您为什么不从SDK中弃用它呢?每个人都有权发表自己的意见。我不使用ARC(至少在它的主要bug被修复之前)。我尽可能地管理自己的记忆。对于这个
-retainCount
工作正常。它实际上被弃用了,因为它不再在ARC中使用,这是推荐的模式。我还没有看到一种使用
retainCount
的模式,这种模式再好不过了——更准确地说——是使用其他工具实现的。由于
retainCount
既不反映自动释放状态也不反映线程状态,因此随着时间的推移,它的用处越来越小。
   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)