Mi programa:¿Por qué DTrace me da errores de direcciones no válidas a veces pero no siempre?
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);
}
Algunos de salida:
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
por qué los errores? Parece ser el nombre de clase (ese es el único %s
, y no obtengo ningún error si lo elimino), pero ¿por qué cree que los nombres de algunas clases son punteros no válidos?
¿Hay alguna forma de que los mensajes de error me digan qué línea de mi programa DTrace causó un problema?
¿Hay alguna manera de llamar al object_getClassName
en lugar de hacer este baile de inspección de estructura?
Por lo que vale, el programa que estoy rastreando funciona bien, no está fallando, por lo que no creo que las clases realmente estén rotas.
Pensé en esto anoche. El diseño de DTrace mantiene la cantidad de 'código' que se ejecuta en el kernel a un mínimo y lo más 'seguro' posible. La resolución del nombre del símbolo ocurre fuera del kernel. El núcleo solo registra la dirección en el búfer, un programa externo se traduce en algo legible después del hecho. La idea era: ¿por qué no agregar la resolución del nombre de clase ObjC a una de esas actividades "fuera del kernel"? Podría valer la pena investigar un poco para ver si es factible, y luego un informe de fallas de RFE a Apple. – johne