8

で定義された非常に便利なマクロがあります.gdbinit

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

lldbに同じマクロを定義する方法はありますか?

4

2 に答える 2

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、回避策です。

于 2012-08-30T21:25:26.913 に答える
2

ちなみに、関数の引数がレジスターで渡されるアーキテクチャー (x86_64、armv7) では、lldb は、整数値を渡すために使用されるレジスター (arg1、arg2 など) にマップされる一連のレジスター・エイリアスを定義します。例えば、

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

また、ABI の規則を覚えなくても、どの引数が put に渡されるかを簡単に確認できます。

   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 は現在、浮動小数点引数に対して同様の便利なエイリアスを提供していません。しかし、最も一般的なケースでは、これは人々が必要とするものをカバーしています。

于 2012-09-23T10:31:42.107 に答える