Mon programme:Pourquoi DTrace me donne-t-il parfois des erreurs d'adresse invalide, mais pas toujours?
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);
}
Quelques sortie:
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
Pourquoi les erreurs? Il semble être le nom de classe (c'est le seul %s
, et je ne reçois aucune erreur si je l'enlève), mais pourquoi pense-t-il que les noms de certaines classes sont des pointeurs invalides?
Y at-il un moyen d'obtenir les messages d'erreur pour me dire quelle ligne de mon programme DTrace a causé un problème?
Existe-t-il un moyen d'appeler object_getClassName
au lieu de faire cette danse de structure-inspection?
Pour ce que ça vaut, le programme que je trace fonctionne très bien, il ne plante pas, donc je ne crois pas que les classes soient vraiment cassées.
J'avais une pensée à ce sujet hier soir. La conception de DTrace réduit au minimum la quantité de 'code' qui est exécutée dans le noyau et aussi 'sûre' que possible. La résolution de nom de symbole se produit en dehors du noyau. Le noyau enregistre uniquement l'adresse dans le tampon, un programme externe se traduit par quelque chose de lisible après le fait. L'idée était pourquoi ne pas ajouter la résolution de nom de classe ObjC à l'une de ces activités "en dehors du noyau"? Cela pourrait valoir un peu d'enquête pour voir si c'est faisable, et ensuite un rapport de bogue RFE à Apple. – johne