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

Android 如何从断点查找调用线程堆栈跟踪?,android,android-studio,android-debug,android-debugging,android-thread,Android,Android Studio,Android Debug,Android Debugging,Android Thread,我的Android代码中有一个线程,在调试时,我需要在线程内设置一个断点。但是,一旦到达线程内的断点,就看不到调用线程的堆栈跟踪。在这一点上,我通常需要在调用线程上设置一个新的断点,并从那里获取它 如上图所示,调试器中的堆栈跟踪将run()显示为顶级方法。如何在堆栈跟踪中向上移动,或切换线程以查看start()及其之前的内容?您不能或不应该看到创建另一个线程的第一个线程的堆栈跟踪。它在多线程中的工作方式是,每个线程都将并行工作。可能发生的情况是,第一个线程调用第二个线程的创建,然后继续执行其他

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


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

您不能或不应该看到创建另一个线程的第一个线程的堆栈跟踪。它在多线程中的工作方式是,每个线程都将并行工作。可能发生的情况是,第一个线程调用第二个线程的创建,然后继续执行其他方法或工作,而操作系统负责创建第二个线程,并在特定时间(通常是尽快)开始执行。当第二个线程执行的第一个方法运行时,它将包含一个几乎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和系统相关的其他事情,从而使你的应用程序继续工作

要执行此操作,只需右键单击已放置在线程中的断点,启用挂起,并选择全部,如下图所示,然后按完成


右键单击>分析>“此处的数据流”,查看它的运行位置并在那里放置断点感谢@希望对您有所帮助,但我不想每次都设置一个新断点。我想知道如何在不重新运行代码的情况下进入它。如果您在“选项”菜单中停止所有线程,那么您可以使用调试器跳转到另一个线程。哦,很有趣!我试图在设置中找到这个,但还没有运气。想告诉我它在哪里吗?谢谢你花时间详细解释。这是有道理的。