安卓工作室线程调试

我在调试带有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 是空白的,就好像主线程已暂停一样。接下来,我看到线程b中的断点也被击中,所以我在Android Studio的调试器中拉出线程视图,但是当我去展开线程b箭头时,那里什么都没有。当我展开主线程时,它显示它在onStart()中的某个地方暂停了。

Android Studio screenshot

是我做错了什么,还是此调试器无法一次调试多个线程?


答案 1

在 IntelliJ IDEA(Android Studio 基于 IntelliJ)中,当您放置断点时,如果右键单击它,则会显示一个对话框,您可以选择是暂停所有线程(默认值)还是仅暂停该线程。

您正在暂停所有线程,因为它是默认设置。


答案 2

在 Android Studio 中,可以指定给定的断点是仅暂停执行线程(触发断点)的执行,还是暂停所有线程的执行。这是基于每个断点(即,某些断点可以挂起所有线程,而其他断点只能挂起当前线程)。

右键单击断点以显示“断点属性”窗口:

Breakpoint properties

请注意“设为默认值”选项,该选项允许对所有新创建的断点进行默认值。

如果只有当前线程处于挂起状态(上图中的选项“线程”),则其他未挂起线程的堆栈帧在“框架”窗口中将不可见:

Frames not available for unsuspended thread