3

コマンドラインを使用して、デバイス(Nexus One-エミュレーターではない)でAndroidアプリケーションをデバッグしたいと思います。

jdbを。と組み合わせて使用​​してブレークポイントを設定する方法に混乱していますandroid.os.Debug.waitForDebugger

私のメインアクティビティに次のコードを入れたとしましょうonCreate

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    android.os.Debug.waitForDebugger();
    int j = 10;
    int r = j;
}

を使用ddmsすると、アプリケーションを起動したときに、アプリケーションがデバッガー(赤いバグアイコン)を待機していることがわかります。

waitForDebugger()ただし、ステップを開始できるように、呼び出し後にブレークポイントを設定する方法がわかりません。

明らかに、アタッチするだけjdbで、停止することなくアプリをすぐに実行し続けることができます。

例えば

jdb -attach localhost:8700

実行する前にブレークポイントをプリセットjdbする方法、またはブレークポイントの設定を開始してからjdbアタッチする方法はありますか?

4

3 に答える 3

3

jdbには設定ファイルがあります:Linuxでは〜/.jdrbc。例えば私のものでは:

stop in net.richardriley.myproj.myact.onCreate

デバイスエミュレータの開発設定で、問題のアプリケーションクラスの「デバッガを待機」を設定できます。アプリケーションを実行し、デバッガーを起動すると、壊れます。

于 2010-08-12T19:42:34.910 に答える
1

残念ながら、VM が既に中断されていることをデバッガーに伝える方法はありません。初期状態が「実行中」以外の場合、私が試したさまざまなデバッガーが混乱します。その結果、デバッガーが接続した後、VM はすべてのスレッドを再開する必要があります。(上記の唯一の例外は、VM が開始されたばかりの場合です。この場合、VM は起動するか中断したままになるかを示す特別な「開始しました」というメッセージを送信できます。これはここでは役に立ちません。)

waitForDebugger() が行うことは、デバッガーからのアクティビティの最初のバーストが静まるまで待機することです。デバッガーが接続した後、デバッガーからのアクティビティが 1.5 秒間なくなるまで、メソッドはスリープ状態になります。これにより、デバッガーは、VM が再開する前に任意のブレークポイントを設定できます。

Eclipse の場合、アタッチする前にブレークポイントを設定できるため、このハックはうまく機能します。jdbの場合、起動後に接続するように指示する方法がないため、キーボードをすばやく操作するか、ある種の構成ファイルを使用する必要があります(これもわかりません)。

これは別の方法で解決できます。waitForDebugger 呼び出しの下に、次のようなループを追加します。

static volatile boolean staticField = false;
  ...
while (!MyClass.staticField) {
    Log.d(tag, "waiting for go");
    Thread.sleep(2000);
}

次に、必要な方法で jdb を構成したら、次のようなものを使用します。

> set MyClass.staticField = true

素早い場合は、ループをスキップして Thread.sleep(5000) だけで、ブレークポイントをスラムするための少し余分な時間を確保できます。

于 2010-06-24T19:43:37.800 に答える
0

両方のソリューション (fadden のソリューションと Richard Riley のソリューション) を試しましたが、どれも機能しませんでした。エミュレーターで起動されたアプリは、jdb がデバッグ ポート (Dalvik 経由で 8700) に接続されるとすぐにブロックが解除されますが、jdb とまったく同期せずに単独で実行されます。待機ループを導入しても状況は変わらず、.jdbrc のブレークポイント コマンドは効果がありません。アプリが実行されていないため、常に、jdb の回答は「ブレークポイントなどを延期します。クラスが読み込まれた後に設定されます。」です。ただし、「実行」と入力すると、アプリは既に実行されているため、答えは「中断されたものはありません。」

于 2010-10-11T17:28:25.813 に答える