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 7fff78a6eb80 string addr = 7fff8e7e83b9 string val=Window dtrace: 启用探针 ID 5 上的错误 (ID 35737: objc9434:NSWindow:-setTitle::entry): 无效地址 (0x6c007400690074) 在 DIF 偏移量 #8 24

您可以假设 NSString 的 MacRoman 或 ASCII 编码 - 基本上无需担心复杂的(从 DTrace 角度来看)编码。

4

1 回答 1

2

您的问题是否真的与另一个问题相同取决于 NSString 的内部表示是否与 CFStringRef 的相同。我不知道,希望其他人能澄清一下,但我怀疑答案是两者不同。另一个问题的答案中的 D 脚本意味着 CFStringRef 有一个字符指针,但是玩弄 gdb 表明 NSString 看起来像这样:

结构 NSString {
    uintptr_t 垫[2];
    字符名称[1];/* 变长数组 */
};

这是一个相应的运行脚本:

bash-3.2# 猫标题.d
类型定义结构{
    uintptr_t 垫[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 firefox
bash-3.2# dtrace -arch x86_64 -Cqs title.d -p 31895
名称 = Mozilla 火狐
名称 = 新标签
名称 = 新标签
名称 = Mozilla 火狐
名称 = 新标签
^C

bash-3.2#

如果您正在检查 32 位进程,则 use-arch i386和 dtrace(1) 将适当地调整其指针大小的概念。

于 2013-08-15T23:44:16.177 回答