dtrace를 사용하여 코드에서 모든 objc_msgSend를 인쇄하고 있습니다. 지금까지 내가 한 것을 사용하여 선택기의 이름을 볼 수 있지만 올바른 클래스 이름을 가져올 수 없습니다. DTracing objc_msgSend가 수신자 클래스 이름을 인쇄하지 않습니다.
이
내의 DTrace 스크립트입니다#!/usr/sbin/dtrace -qs
pid$target::objc_msgSend:entry
{
self->isa = *(long *)copyin(arg0, 8);
printf("-[%s %s]\n",
copyinstr(*(long *)copyin(self->isa + 16, 8)),
copyinstr(arg1));
}
나는하여 ID 수신기 객체는 다음과 같은 구조체 인 것이 가정입니다 : 도달하기 위해, 내 머리에서
typedef struct objc_class {
struct objc_class *isa;
struct objc_class *super_class;
char *name;
...
}
포인터를 옮겨야하는 이름 2 * sizeof (objc_class *)는 16을 만들고 크기 8의 포인터를 얻습니다. 따라서 클래스 이름을 볼 것으로 예상되었지만 대신 약간의 쓰레기가 인쇄됩니다.
내가 잘못하고있는 것에 대한 아이디어가 있습니까?
내 시스템은 Mavericks x64입니다.
'struct objc_class'의 정의는 32 비트 Mac을 제외한 모든 곳에서 부정확합니다. –
올바른 것을 알고 있습니까? – Vame