chương trình của tôi:Tại sao DTrace thỉnh thoảng cho tôi lỗi địa chỉ không hợp lệ nhưng không phải lúc nào?
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);
}
Một số đầu ra:
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
Tại sao các lỗi? Nó có vẻ là tên lớp (đó là chỉ %s
, và tôi không nhận được bất kỳ lỗi nào nếu tôi xóa nó), nhưng tại sao nó nghĩ rằng một số tên của lớp là con trỏ không hợp lệ?
Có cách nào để nhận được thông báo lỗi thực sự cho tôi biết dòng chương trình DTrace nào của tôi gây ra sự cố không?
Có cách nào để gọi object_getClassName
thay vì thực hiện điệu nhảy kiểm tra cấu trúc này không?
Đối với những gì đáng giá, chương trình tôi truy tìm hoạt động tốt — nó không bị lỗi, vì vậy tôi không tin rằng các lớp thực sự bị hỏng.
Tôi đã có một suy nghĩ về đêm qua. Thiết kế của DTrace giữ số lượng 'mã' chạy trong hạt nhân đến mức tối thiểu, và là 'an toàn' càng tốt. Độ phân giải tên biểu tượng xảy ra bên ngoài hạt nhân. Hạt nhân chỉ ghi lại địa chỉ trong bộ đệm, một chương trình bên ngoài dịch thành một cái gì đó có thể đọc được sau khi thực tế. Ý tưởng là - tại sao không thêm độ phân giải tên lớp ObjC vào một trong những hoạt động "bên ngoài hạt nhân" đó? Có thể có giá trị một chút điều tra để xem nó có khả thi hay không, và sau đó báo cáo lỗi RFE cho Apple. – johne