Mój program:Dlaczego DTrace czasami podaje mi błędy nieprawidłowych adresów, ale nie zawsze?
typedef struct objc_class {
struct objc_class *isa;
struct objc_class *super_class;
char *name;
long version;
long info;
long instance_size;
void *ivars;
void *methodLists;
void *cache;
void *protocols;
} *Class;
struct objc_object {
Class isa;
};
/* Code to extract the class name from arg0 based on a snippet by Bill Bumgarner: http://friday.com/bbum/2008/01/26/objective-c-printing-class-name-from-dtrace/ */
objc$target:NSObject:-init:entry {
printf("time: %llu\n", timestamp);
printf("arg0: %p\n", arg0);
obj = (struct objc_object *)copyin(arg0, sizeof(struct objc_object));
printf("obj: %p\n", obj);
printf("obj->isa: %p\n", obj->isa);
isa = (Class)copyin((user_addr_t)obj->isa, sizeof(struct objc_class));
printf("isa: %p\n", obj->isa);
classname = copyinstr((user_addr_t)(isa->name));
printf("classname: %s\n", classname);
}
Niektóre wyjściowe:
dtrace: script 'test.d' matched 1 probe
dtrace: error on enabled probe ID 1 (ID 61630: objc5936:NSObject:-init:entry): invalid address (0x90206b98) in action #8 at DIF offset 28
dtrace: error on enabled probe ID 1 (ID 61630: objc5936:NSObject:-init:entry): invalid address (0x90206b98) in action #8 at DIF offset 28
dtrace: error on enabled probe ID 1 (ID 61630: objc5936:NSObject:-init:entry): invalid address (0x90206b98) in action #8 at DIF offset 28
CPU ID FUNCTION:NAME
0 61630 -init:entry time: 28391086668386
arg0: 1291ae10
obj: 6f0a1158
obj->isa: a023f360
isa: a023f360
classname: NSBitmapImageRep
1 61630 -init:entry time: 28391586872297
arg0: 12943560
obj: 6f4a1158
obj->isa: 2fca0
isa: 2fca0
classname: GrowlApplicationTicket
1 61630 -init:entry time: 28391586897807
arg0: 152060
obj: 6f4a1280
obj->isa: 2fe20
isa: 2fe20
classname: GrowlNotificationTicket
2 61630 -init:entry time: 28391079142905
arg0: 129482d0
obj: 700a1128
obj->isa: a0014140
isa: a0014140
classname: NSDistributedObjectsStatistics
2 61630 -init:entry time: 28391079252640
arg0: 147840
obj: 700a1250
obj->isa: a0014780
isa: a0014780
classname: NSDistantObjectTableEntry
dlaczego błędy? Wygląda na to, że jest to nazwa klasy (to jedyna %s
, i nie otrzymam żadnych błędów, jeśli ją usunę), ale dlaczego sądzi, że niektóre nazwy klas są nieprawidłowymi wskaźnikami?
Czy istnieje sposób, aby komunikaty o błędach rzeczywiście mi powiedzieć, która linia mojego programu DTrace spowodowało problem?
Czy istnieje sposób na wywołanie object_getClassName
zamiast wykonywania tego tańca inspekcyjnego?
Co jest warte, że program, który śledzę, działa dobrze - nie ulega awarii, więc nie wierzę, że zajęcia są naprawdę zepsute.
Myślałem o tej ostatniej nocy. Projekt DTrace utrzymuje minimalną ilość "kodu" uruchamianego w jądrze i jest "bezpieczna", jak to tylko możliwe. Rozpoznawanie nazw symboli odbywa się poza jądrem. Jądro rejestruje tylko adres w buforze, a program zewnętrzny przekłada się na coś czytelnego po fakcie. Pomysł polegał na tym, dlaczego nie należy dodawać rozwiązywania nazw klas ObjC do działań "poza kernelem"? Może warto byłoby przeprowadzić dochodzenie, aby sprawdzić, czy jest to wykonalne, a następnie raport o błędach RFE dla Apple. – johne