Mein Programm:Warum gibt DTrace manchmal ungültige Adressfehler, aber nicht immer?
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);
}
Einige Ausgabe:
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
Warum die Fehler? Es scheint der Klassenname zu sein (das ist der einzige %s
, und ich bekomme keine Fehler, wenn ich ihn entferne), aber warum denkt er, dass die Namen einiger Klassen ungültige Zeiger sind?
Gibt es eine Möglichkeit, die Fehlermeldungen zu erhalten, um mir tatsächlich zu sagen, welche Zeile meines DTrace-Programms ein Problem verursachte?
Gibt es eine Möglichkeit, object_getClassName
aufzurufen, anstatt diesen Struktur-Inspektions-Tanz zu machen?
Für was es wert ist, funktioniert das Programm, das ich suche, gut - es stürzt nicht ab, also glaube ich nicht, dass die Klassen wirklich gebrochen sind.
Ich hatte einen Gedanken über diese letzte Nacht. Das Design von DTrace hält die Menge an "Code", die im Kernel ausgeführt wird, auf ein Minimum und so sicher wie möglich. Auflösung des Symbolnamens geschieht außerhalb des Kernels. Der Kernel protokolliert nur die Adresse im Puffer, ein externes Programm wird später in etwas lesbares übersetzt. Die Idee war- warum nicht ObjC Klassennamen Auflösung zu einer dieser "außerhalb des Kernels" Aktivitäten hinzufügen? Es könnte ein bisschen Nachforschung wert sein, um zu sehen, ob es machbar ist, und dann ein RFE-Fehlerbericht an Apple. – johne