web-dev-qa-db-ja.com

Android Studioスレッドデバッグ

Android Studio 1.1でマルチスレッドアプリのデバッグに問題があります。ブレークポイントにヒットすると、ブレークポイントを持つスレッドだけでなく、他のすべてのスレッドも停止するようです。アクティビティのonCreateで次のメソッドを使用した簡単なテストアプリ。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Thread a = new Thread("thread-a") {
        @Override
        public void run() {
            Log.v("thread", "thread-a");
        }
    };

    Thread b = new Thread("thread-b") {
        @Override
        public void run() {
            Log.v("thread", "thread-b");
        }
    };

    a.start();
    b.start();
}

Thread-aとthread-bのLog.v行にブレークポイントを設定し、Lollipop Nexus 5でデバッグモードで実行します。

アプリが起動すると、thread-aのブレークポイントにヒットしますが、最初の問題は、メインスレッドが一時停止されているかのようにアプリのUIが空白になることです。次に、thread-bのブレークポイントもヒットすることを確認しました。そのため、Android Studioのデバッガーで[スレッド]ビューを表示しますが、thread-b矢印を展開すると、何も表示されません。メインスレッドを展開すると、onStart()のどこかで一時停止していることがわかります。

Android Studio screenshot

私は何か間違ったことをしているのですか、このデバッガは一度に複数のスレッドをデバッグできませんか?

40
miguel

IntelliJでは、IDEA(およびAndroid StudioはIntelliJに基づいています)、ブレークポイントを配置するときに、ブレークポイントを右クリックするとダイアログが表示され、すべてのスレッドを一時停止する(デフォルト)か、そのスレッドのみを一時停止するかを選択できます。

これはデフォルト設定であるため、すべてのスレッドを一時停止しています。

53
Mister Smith

Android Studioでは、特定のブレークポイントが実行中のスレッド(ブレークポイントをトリガーする)のみの実行を中断するか、すべてのスレッドを中断するかを指定できます。これはブレークポイントごと(つまり、ブレークポイントはすべてのスレッドを中断できますが、他のスレッドは現在のスレッドのみを中断できます。

ブレークポイントを右クリックして、[ブレークポイントのプロパティ]ウィンドウを表示します。

Breakpoint properties

[デフォルトにする]オプションに注意してください。これにより、新しく作成されたすべてのブレークポイントに対してこれをデフォルトにすることができます。

現在のスレッドのみが中断されている場合(上の図のオプション「スレッド」)、中断されていない他のスレッドのスタックフレームは、フレームウィンドウに表示されません。

Frames not available for unsuspended thread

24
CJBS