Cocoa 如何从DTrace脚本打印NSString

Cocoa 如何从DTrace脚本打印NSString,cocoa,nsstring,dtrace,Cocoa,Nsstring,Dtrace,这是问同样的问题,但当我试着: 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("st

这是问同样的问题,但当我试着:

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-设置标题:100685240 7fff92d82f73 7fff78a6eb80字符串地址=7fff8e7e83b9字符串值=窗口 dtrace:启用的探测器ID 5(ID 35737: objc9434:NSWindow:-setTitle::entry:无效地址 (0x6C00740006074)在DIF偏移量24处8起作用


您可以假设NSString采用MacRoman或ASCII编码,基本上不需要担心复杂的(从DTrace的角度)编码

你的问题是否真的与另一个相同 这取决于NSString的内部表示是否 与CFStringRef的相同。我不知道,我希望 其他人可以澄清,但我怀疑答案是 两者是不同的。另一个问题答案中的D脚本暗示 CFStringRef有一个字符指针,但正在播放 关于gdb,建议NSString如下所示:

struct NSString { uintptr_t pad[2]; char name[1]; /* variable length array */ }; 结构NSString{ uintptr_t垫[2]; 字符名[1];/*可变长度数组*/ }; 下面是一个相应的脚本:

bash-3.2# cat title.d typedef struct { uintptr_t pad[2]; char name[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 firefox 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 name = Mozilla Firefox name = New Tab name = New Tab name = Mozilla Firefox name = New Tab ^C bash-3.2# bash-3.2#猫的标题.d 类型定义结构{ uintptr_t垫[2]; 字符名[1]; }国家统计局; objc$target:NSWindow:-setTitle?:条目 { self->namep=(uintpttr\u t)arg2+offsetof(NSString\u t,name); printf(“name=%s\n”,copyinstr(self->namep)); } bash-3.2#ps-ef | fgrep-iFirefox 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-拱门x86#U 64-Cqs标题d-第31895页 name=Mozilla Firefox 名称=新选项卡 名称=新选项卡 name=Mozilla Firefox 名称=新选项卡 ^C bash-3.2#
如果您正在检查一个32位进程,那么使用
-arch i386
,dtrace(1)将适当调整其指针大小的概念。

使用USDT比破解NSString内部表示更容易。也许,但问题仍然存在。此外,可能有很多方法需要添加一个USDT,当所有这些都说了又做了之后,考虑到我在代码中使用调试代码的程度以及添加所有USDT的工作量,能够简单地打印NSString可能是最简单的事情。此解决方案适用于OS X应用程序,但似乎不适用于在Sim卡下运行的iOS应用程序。NSString的结构可能有点不同。你能详细说明一下你是如何使用gdb设计出这个结构的吗?@MarkEdington:看看你的正式问题。