2

我的 Android 代码中有一个线程,在调试时,我需要在线程内设置一个断点。但是,一旦我在线程内部的断点处,我就看不到调用线程的堆栈跟踪。此时,我通常需要在调用线程处设置一个新的断点并从那里获取。

在此处输入图像描述

如上图所示,调试器中的堆栈跟踪将 run() 显示为顶级方法。如何在堆栈跟踪中向上移动,或切换线程以查看 start() 以及之前的任何内容?

4

1 回答 1

2

您不能或不应该看到创建另一个线程的第一个线程的堆栈跟踪。它在多线程中的工作方式是每个都将并行工作。可能发生的情况是第一个线程调用第二个线程的创建,然后继续执行其他方法或工作,而操作系统负责创建第二个线程并在特定时间(通常是尽快)开始执行某些操作。第二个线程将包含一个几乎堆栈跟踪,因为它正在执行的第一个方法正在运行。它会在代码访问其他方法时填充,并在它退出/完成它正在执行的方法时清空。因此有这样的代码:

Log.i("FirstThread", "creating secondThread");
Thread secondThread = new Thread(new Runnable() {
    @Override
    public void run() {
        Log.i("SecondThread", "run called");
    }
});
secondThread.start();
Log.i("FirstThread", "finished creating secondThread");

最终可能会出现以下日志:

FirstThread: creating secondThread
FirstThread: finished creating secondThread
SecondThread: run called

底线是第一个日志将始终是第一个,因为线程第二个线程是在它之后创建的,但是第二个和第三个日志可以在不同的时间和试验中切换(一个在另一个之前,反之亦然)。那是因为它们并行工作,并且操作系统正在管理第二个线程启动的时间以及它执行执行的资源。

您可以看到另一个线程正在执行什么,但是它可能是您将看到的 Android 的主 UI 线程,因此它可能没有执行您的代码并正在执行与绘制您的 UI 和系统相关的东西相关的其他事情,因此要保持您的应用程序正常工作。

为此,只需右键单击您在线程中放置的断点,启用Suspend并选择All,如下图所示,然后按Done

在此处输入图像描述

于 2017-05-15T18:19:07.507 回答