我有一个 gdb 脚本,我正在处理所有通过 objc_msgSend 的 Objective-C 方法调用,但我遇到了一个我似乎无法处理的问题。在查看了 Objective-C 运行时源代码之后,我开发了以下脚本来在 objc_msgSend 的每个中断处打印 [ ]。问题是在某些情况下 data_NEVER_USE 不是有效指针但也不为空。我能找到的关于一个类是否已初始化的唯一指标是 id->data_NEVER_USE->flags & RW_REALIZED。我在这里遗漏了类初始化的哪些方面可以让我跳过这种情况?
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
我很感激这方面的任何帮助。谢谢。