objc_msgSend を通過するすべての Objective-C メソッド呼び出しをトレースするために取り組んでいる gdb スクリプトがありますが、対処できないと思われる問題に遭遇しました。Objective-C ランタイム ソース コードを確認した後、objc_msgSend の各ブレークで [ ] を出力する次のスクリプトを開発しました。問題は、data_NEVER_USE が有効なポインターではなく、null でもない状況があることです。クラスが初期化されているかどうかを確認できる唯一の指標は、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
これについて何か助けていただければ幸いです。ありがとう。