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

时间:2017-05-11 13:23:55

标签: android android-studio android-debug android-debugging android-thread

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

enter image description here

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

1 个答案:

答案 0 :(得分:2)

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

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和系统相关的内容有关,从而使您的应用程序保持正常运行。

要执行此操作,只需右键单击您在线程中放置的断点,启用暂停,然后选择全部,如下图所示,然后按<强>完成:

enter image description here