Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LLDB equivalent of GDB's macros

I have a very useful macro defined in .gdbinit

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

Is there anyway to define the same macro for lldb ?

like image 730
bioffe Avatar asked Aug 30 '12 20:08

bioffe


2 Answers

You can do that with the following command definition in lldb:

command regex rc 's/(.+)/print (int)[%1 retainCount]/'

Example:

(lldb) rc indexPath
print (int)[indexPath retainCount]
(int) $2 = 2

You can put that into ~/.lldbinit (and restart Xcode).

One should think that something like

command alias rc print (int)[%1 retainCount]

should work, but as explained in I can't get this simple LLDB alias to work the %1 expansion does not work with expression, and command regex is a workaround.

like image 131
Martin R Avatar answered Nov 11 '22 17:11

Martin R


Incidentally, on architectures where function arguments are passed in registers (x86_64, armv7), lldb defines a series of register aliases that map to the register used to pass the integral values -- arg1, arg2, etc. For instance,

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

and we can easily see what argument is passed in to puts without having to remember the ABI conventions,

   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 and armv7 both pass the first "few" integral values in registers - beyond that they can get stored on the stack or other places and these aliases don't work. lldb doesn't currently provide similar convenience aliases for floating point arguments. But for the most common cases, this is covers what people need.

like image 40
Jason Molenda Avatar answered Nov 11 '22 16:11

Jason Molenda