Il mio programma:Perché DTrace mi dà errori di indirizzo non valido a volte ma non sempre?
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);
}
qualche uscita:
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
Perché gli errori? Sembra essere il nome della classe (questo è l'unico %s
, e non ottengo alcun errore se lo rimuovo), ma perché pensa che i nomi di alcune classi siano puntatori non validi?
C'è un modo per ottenere i messaggi di errore per dirmi che in realtà la linea del mio programma di DTrace causato un problema?
C'è un modo per chiamare object_getClassName
invece di fare questa danza struttura-ispezione?
Per quello che vale, il programma che sto tracciando funziona bene-non è che si infrangono, quindi non credo che le classi in realtà sono rotti.
Ho pensato a questa notte scorsa. Il design di DTrace mantiene al minimo la quantità di "codice" che viene eseguita nel kernel e il più "sicuro" possibile. La risoluzione dei nomi dei simboli avviene al di fuori del kernel. Il kernel registra solo l'indirizzo nel buffer, un programma esterno si traduce in qualcosa di leggibile dopo il fatto. L'idea era: perché non aggiungere la risoluzione del nome della classe ObjC a una di quelle attività "al di fuori del kernel"? Potrebbe valere un po 'di indagine per vedere se è fattibile, e poi un bug report RFE ad Apple. – johne