4

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

これについて何か助けていただければ幸いです。ありがとう。

4

1 に答える 1

6

これらの2つの方法は、私にとってかなりうまく機能しました。私の例では、起動したらすぐに監視するために「SomeApp」を手動で起動していることに注意してください。

gdb
(gdb) attach --waitfor 'SomeApp'

**this is where you manually start SomeApp on your device**

call (void)instrumentObjcMessageSends(YES)

「instrumentObjcMessageSends」は、ランタイム内からのメッセージ ロギングを有効/無効にします。この方法の詳細については、次を参照してください。

iDevice で GDB を引き続き使用する別のオプションは、次のような小さなコマンドを記述することです。

FooPad:~ root# gdb
(gdb) attach SBSettings
Attaching to process 440.
Reading symbols for shared libraries . done
Reading symbols for shared libraries ............................. done
0x35686004 in mach_msg_trap ()

(gdb) break objc_msgSend
Breakpoint 1 at 0x3323ef72

(gdb) commands
Type commands for when breakpoint 1 is hit, one per line.
End with a line saying just "end".

>printf "-[%s %s]\n", (char *)class_getName(*(long *)$r0,$r1),$r1
>c
>end

(gdb) c
Continuing.
// a ton of information will follow

"c" ("Continuing." と表示されている行のすぐ上) を押すとすぐに、画面に関数名と引数が表示されます。

最後に、次の手順に従って、iDevice で GDB を動作させます。後世のために、簡単な手順をここに投稿します。

GNU Debugger (gdb) は、iOS アプリケーションの実行時の動作を分析するために使用されます。最近の iOS バージョンでは、Cydia から直接ダウンロードした GNU Debugger が壊れており、正しく機能していません。Pod 2g のブログ記事をフォローしても役に立ちませんでした。

この問題を解決するには、http://cydia.radare.org を cydia ソースに追加、最新の GNU Debugger (ビルド 1708) をダウンロードします。GDB ビルド 1708 は iOS 5.x で動作します。

于 2012-10-18T22:41:22.513 に答える