如何从断点找到调用线程堆栈跟踪?

How to find calling thread stack trace from breakpoint?

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

如您在上图中所见,调试器中的堆栈跟踪将 运行() 显示为顶级方法。我如何在堆栈跟踪中向上移动,或切换线程以查看 start() 以及它之前发生的任何事情?

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

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

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

您可以看到其他线程正在执行什么,但是您将看到的可能是 Android 的主 UI 线程,所以它可能 不是 执行您的代码并执行与绘图相关的其他事情 UI 和系统相关的东西,从而使您的应用程序保持运行。

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