This question is asking the same thing, but when I tried:
typedef long long ptr_t;
objc$target:NSWindow:-setTitle?:entry
{
printf( \"%30s %10s %x %x %x\\n
Whether or not your question really is the same as the other one depends on whether or not the internal representation of an NSString is the same as that of a CFStringRef. I don't know, and I hope that someone else can clarify, but I suspect that the answer is that the two are different. The D script in the other question's answer implies that a CFStringRef has a character pointer, but playing around with gdb suggests that an NSString looks like this:
struct NSString { uintptr_t pad[2]; char name[1]; /* variable length array */ };
Here's a corresponding script in action:
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#
If you're inspecting a 32-bit process then use -arch i386
and dtrace(1) will adjust its notion of pointer sizes appropriately.