我有一個gdb腳本我正在努力跟蹤所有通過objc_msgSend傳遞的Objective-C方法調用,但是我遇到了一個我似乎無法處理的問題。在回顧了Objective-C運行時源代碼之後,我開發了以下腳本來在objc_msgSend的每個中斷處打印[]。問題是有些情況下data_NEVER_USE不是有效的指針,但也不爲空。我能找到一個類是否初始化的唯一指標是在id-> data_NEVER_USE-> flags & RW_REALIZED。我在這裏丟失了哪些類初始化的內容,可以讓我跳過這種情況?GDB腳本跟蹤在iOS設備上的Objective-C調用 - 問題
b objc_msgSend
c
commands
silent
if (*$r0 == 0)
continue
end
set $id = (class_t *)$r0
set $sel = $r1
print *$id
if($id->data_NEVER_USE != 0)
set $data = (class_ro_t *) ($id->data_NEVER_USE)
if (($data->flags & 0x80000000) && ($data->name))
set $classname = $data->name
printf "[%s ", $classname
else
continue
end
end
if ($sel != 0)
printf "%s", $sel
else
printf "null"
end
printf "]\n"
continue
end
我很感激這方面的幫助。謝謝。
感謝您的鏈接。不幸的是,使用模擬器不是一種選擇。對我來說最有用的方法是允許在物理設備上進行跟蹤,而無需訪問源代碼。 –