LLDB相当于GDB的宏

时间:2012-08-30 20:38:37

标签: objective-c gdb lldb

我在.gdbinit

中定义了一个非常有用的宏
define rc
call (int)[$arg0 retainCount]
end

无论如何为 lldb 定义相同的宏?

2 个答案:

答案 0 :(得分:5)

您可以使用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]

应该有效,但正如I can't get this simple LLDB alias to work中所述,%1扩展不适用于表达式,command regex是一种解决方法。

答案 1 :(得分:2)

顺便提一下,在函数参数在寄存器(x86_64,armv7)中传递的体系结构中,lldb定义了一系列寄存器别名,这些寄存器别名映射到用于传递整数值的寄存器 - arg1,arg2等。例如,< / p>

#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都通过了第一个&#34;少数&#34;寄存器中的积分值 - 超出它们可以存储在堆栈或其他地方,这些别名不起作用。 lldb目前还没有为浮点参数提供类似的便利别名。但对于最常见的情况,这涵盖了人们的需求。