9

エミュレーター上の Android アプリでスタンドアロンの Java デバッガーを使用すると問題が発生します。どうやら、jdb(またはjswat)などのリモート対応のJavaデバッガーは、以下の手順に従うことで活用できます(あちこち読んだ後、理解できます)。

1) エミュレーターの電源を入れ、エミュレーターにアプリをインストールします (adb install)

2) dalvik サーバー (ddms) をオンにします。

3)エミュレータで、「DevTools」アプリを実行します->「開発設定」->デバッグするアプリを選択し、「デバッガーを待機」フラグを有効にします

4) エミュレーターで再びアプリを実行します。デバッガーがアタッチされるのを待ってブロックされ、dalvik は「赤いバグ」によってフラグが立てられた新しいプロセスを表示します。

5) dalvik で、赤旗のプロセスを選択します。したがって、そのデバッグ ポートは localhost:8700 に転送されます。

6) デバッガーを localhost:8700 にフックします。jdb では、「jdb -attach 8700」を実行する必要があります。

デバッガーが起動されるとすぐに、エミュレーター上のアプリのブロックが解除されます。したがって、アプリはデバッガーを適切に検出したため、無料で実行されているようです。

ただし、重要なのは、「自由に実行される」ことです。つまり、デバッガーが「実行」コマンドを発行するのを待ちません。そのため、ブレークポイントを設定する機会がありません。

1のヒントに従って、ブレークポイントを設定する時間があることを期待して、アプリの先頭に待機ループを配置しようとしました。ブレークポイントを設定しようとすると、アプリがまだ実行されていないため、jdb は「ブレークポイント XXX.YYY を保留しています。クラスがロードされた後に設定されます。」と表示します。しかし、「実行」コマンドを発行すると、アプリは既に実行されていたため、答えは「中断されたものはありません」です (実際に実行されています)。

jswat ではこれらのメッセージは表示されませんが、最終的な結果は同じです :-(

言うまでもなく、「jdb -attach」は、localhost で実行されている Android 以外の Java アプリでも問題なく動作します。

ヒントはありますか(「日食を使用してください」を除く)?

ばかげた詳細がどこかに欠けているだけですか?

アプリはHelloWorld、ビルドコマンドは「ant debug」です。

前もって感謝します。

4

4 に答える 4

5

最善の方法は、.jdbrc ファイルにブレークポイントを設定することです。これは、これらがロードされて延期され、待機中にデバッガーをキャッチしようとする任意の遅延ループを設定するためにコードを変更する必要がないためです。あなたと同じように、クラス名にブレークポイントを設定すると機能しないことがわかりました。クラスがロードされるまで延期すると書かれていますが、クラスがロードされたときにjdbが通知されないようです。

ただし、特定のクラスと行番号にブレークポイントを設定すると機能します

.jdbrc ファイルで:

com.android.helloandroid.HelloAndroid で停止
com.android.helloandroid.HelloAndroid:21 で停止します。

ご存知のように、最初の行は何もしません。ここで2行目が機能します:

jdb を初期化しています...
*** /home/codeboy2k/.jdbrc からコマンドを読み取ります
遅延ブレークポイント com.android.helloandroid.HelloAndroid.
クラスがロードされた後に設定されます。
> 遅延ブレークポイント com.android.helloandroid.HelloAndroid:21.
クラスがロードされた後に設定されます。
> > 遅延ブレークポイントを設定する com.android.helloandroid.HelloAndroid:21

ブレークポイント ヒット: "thread= main", com.android.helloandroid.HelloAndroid.onCreate(), line=21 bci=11

 メイン[1]

したがって、ブレークポイントで特定の行番号を使用することが重要なようです。試してみてください。それがあなたを助け、あなたのためにも働くことを願っています.

于 2010-10-16T11:44:22.257 に答える
0

また、dalvik を起動するときに、コマンド ラインで suspend=y JDWP オプションを探してください。

于 2011-10-13T05:48:35.370 に答える
0

eclipse 以外のセットアップで気づいたことの 1 つは、ADV がまだ実行されている場合、デバッグ セッションをアタッチできますが (ポート 8700)、ブレークポイントをヒットさせることができません ... ADV を閉じると動作します。理由はわかりませんが、これは私にとってはうまくいきます。

役立つ場合に備えて、これが私のセットアップです私は現在バージョン17を使用していますが、それ以外は同じセットアップです。

于 2013-05-09T18:39:16.657 に答える
0

はい、動作します :-) codeboy2k さん、どうもありがとうございました!

私もさらに実験を行いましたが、メソッド名を指定しても機能するようです (例: 「com.android.helloandroid.HelloAndroid.onCreate で停止」)。したがって、重要なトリックは、jdb の起動ファイルに最初のブレークポイントを設定することです。これにより、アプリはそのブレークポイントでブロックされ、実際のデバッグ セッションが続行されます。

jswat も試してみましたが、正しい手順は次のとおりです。ソース コードを読み込み、ブレークポイント (少なくとも最初のブレークポイント) を設定し、デバッガーをアプリにアタッチします (その間、デバッガーを待機していました)。それ以降、アプリは 1 つのブレークポイントから別のブレークポイントに進みます。ただし、jswat がソース コード自体にこの進捗状況を示していないのは残念です :-(

于 2010-10-18T08:38:46.067 に答える