8

アプリが JNI を介して使用するネイティブ共有ライブラリをデバッグしようとしています。「gdbserver --attach pid」を使用して実行中のアプリに問題なくアタッチできますが、gdbserver コマンドを起動するときに実際にアプリを起動する必要があります。

このトピックには 100 万件のブログ ヒットがありますが、どのようにアプリを起動するかについて明確にしているようには見えません。彼らはすべて「gdbserver 10.0.2.2:1234 ./MyProgram」と入力するように言っていますが、正確には「MyProgram」とは何ですか。それは MyProgram.apk ですか?MyProgram.soですか?アプリのインストール時に作成される他のファイルですか?もしそうなら、その経路は何ですか?

4

3 に答える 3

5

他の人が説明しているように、シェルから直接起動できる独立したアプリケーションを開発することは可能ですが、コードは Android アプリケーション フレームワーク内で実行されるようです。したがって、実行可能ファイルはなく、代わりに Dalvik クラス ファイルとネイティブ共有オブジェクトを含む他のリソースを含む APK があります。

APK でアプリケーションを起動するには、いくつかの手順が必要です

  1. system_server プロセスは、アプリケーションを要求するインテントを受け取ります。
  2. Zygote プロセスは、新しいプロセスをフォークしてクラスのメソッドを実行するように指示されます。
  3. アプリケーションは新しいプロセスで実行されます。

am実行可能ファイルを gdbserver に渡して APK を直接起動することはできませんが、コマンドを使用してシェルから起動するのはかなり簡単です。

$ adb -d shell
# am
usage: am [subcommand] [options]

    start an Activity: am start [-D] <INTENT>
        -D: enable debugging

    send a broadcast Intent: am broadcast <INTENT>

    start an Instrumentation: am instrument [flags] <COMPONENT>
        -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT)
        -e <NAME> <VALUE>: set argument <NAME> to <VALUE>
        -p <FILE>: write profiling data to <FILE>
        -w: wait for instrumentation to finish before returning

    start profiling: am profile <PROCESS> start <FILE>
    stop profiling: am profile <PROCESS> stop

    <INTENT> specifications include these flags:
        [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
        [-c <CATEGORY> [-c <CATEGORY>] ...]
        [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
        [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
        [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
        [-n <COMPONENT>] [-f <FLAGS>] [<URI>]


# am start -n com.android.browser/.BrowserActivity
Starting: Intent { cmp=com.android.browser/.BrowserActivity }
#

アプリケーションが実行されたら、gdbserver --attach <pid>以前と同じように使用します。運が良ければ、アプリケーションはユーザーの操作を待ってからネイティブ コードを呼び出し、GDB にブレークポイントをアタッチして設定する機会を与えます。

于 2010-05-07T19:55:13.650 に答える
4

Google は、問題に対する公式の解決策を提供しています:「ndk-gdb」

これは NDK に含まれています。IIRC では、APK 内に gdbserver のコピーがバンドルされている必要があります。IIRC では、「ndk-build」で APK をビルドし、適切な引数を指定した場合、これは自動的に行われます。

$NDK/docs/NDK-BUILD.html および $NDK/docs/NDK-GDB.html にある Google のドキュメントを参照してください。

</ライアン>

于 2011-10-05T16:49:55.237 に答える