1

この質問は同じことを尋ねていますが、私が試したとき:

typedef long long ptr_t;


objc$target:NSWindow:-setTitle?:entry
{

    printf( "%30s %10s %x %x %x\n", probemod, probefunc, arg0, arg1, arg2 );

    this->str = *(ptr_t*)copyin(arg2+2*sizeof(ptr_t), sizeof(ptr_t));

    printf("string addr = %p\n", this->str);
    printf("string val  = %s\n", copyinstr(this->str));
}

うまくいきませんでした。arg2 は NSString のアドレスでなければなりません。私は得た:

NSWindow -setTitle: 100685240 7fff92d82f73 7fff92d82f73 7fff78a6eb80 string addr = 7fff8e7e83b9 string val=Window dtrace: 有効なプローブ ID 5 でのエラー (ID 35737: objc9434:NSWindow:-setTitle::entry): 無効なアドレス (0x6c007400690074) アクション #8 の DIF オフセット24

NSString の MacRoman または ASCII エンコーディングを想定できます。基本的に、(DTrace の観点から) 複雑なエンコーディングについて心配する必要はありません。

4

1 に答える 1

2

あなたの質問が実際に他の質問と同じであるかどうかは、NSString の内部表現が CFStringRef の内部表現と同じであるかどうかによって異なります。わかりません。他の誰かが明確にしてくれることを願っていますが、答えは2つが異なるということだと思います。他の質問の回答の D スクリプトは、CFStringRef に文字ポインターがあることを意味しますが、gdb で遊んでみると、NSString は次のようになります。

構造体 NSString {
    uintptr_t pad[2];
    文字名[1]; /* 可変長配列 */
};

実際の対応するスクリプトは次のとおりです。

bash-3.2# 猫のタイトル.d
typedef 構造体 {
    uintptr_t pad[2];
    文字名[1];
} NSString_t;

objc$target:NSWindow:-setTitle?:entry
{
    self->namep = (uintptr_t)arg2 + offsetof(NSString_t, name);
    printf("name = %s\n", copyinstr(self->namep));

}
bash-3.2# ps -ef | fgrep -i ファイアフォックス
  501 31895 204 0 0:01.22 ?? 0:04.48 /opt/Applications/Firefox.app/Contents/MacOS/firefox -psn_0_27167207
    0 32045 31422 0 0:00.05 ttys000 0:00.06 fgrep -i ファイアフォックス
bash-3.2# dtrace -arch x86_64 -Cqs title.d -p 31895
名前 = Mozilla Firefox
名前 = 新しいタブ
名前 = 新しいタブ
名前 = Mozilla Firefox
名前 = 新しいタブ
^C

バッシュ-3.2#

32 ビット プロセスを検査している場合は-arch i386、dtrace(1) を使用すると、ポインター サイズの概念が適切に調整されます。

于 2013-08-15T23:44:16.177 に答える