IntelliJ IDEA Tutorials

暂停程序 (Pause Program):无需断点也可轻松调试!

Read this post in other languages:

在典型的调试场景中, 你会设置断点来告诉调试器何时暂停你的程序。 断点通常标志着进一步调查的开始。

决定在哪里设置断点并不简单。 有时会发生不清楚确切行数的情况, 也有开发者更倾向于根据时间而不是特定代码来暂停程序。

在本文中,我们将探讨 IntelliJ IDEA 的暂停程序 (Pause Program) 功能—— 这是一个较少为人知,但是在某些场景下又极其强大的调试技术, 包括上述提到的情况。 我们将讨论它的使用场景和限制,并分享一个隐秘的单步调试技巧。

什么是暂停功能?

暂停程序 (Pause Program) 是 IntelliJ IDEA 调试器中的一项功能,让开发者能够在任意时刻暂停应用程序的执行。 更重要的是,即使不熟悉应用程序代码也不影响使用。甚至,代码可以被完全忽略!

Pause button on the debugger's toolbar

要暂停程序,请点击调试器工具栏上的暂停程序 (Pause Program) 。 然后,程序将在执行过程中的任意点暂停。

局限

乍一看,暂停的程序可能与在断点处暂停的程序看起来完全相同。 然而,事实并非如此。

Debugger looks the same regardless of whether Pause or a breakpoint was used to suspend the app

暂停程序 (Pause Program)更应被视为一种“增强版的线程转储(Thread Dump Plus)”。 您仍然可以像通常那样检查变量和线程。 但是,一些更高级的调试功能,如对表达式求值 (Evaluate Expression) ,将无法工作。

使用场景

暂停程序 (Pause Program) 有无数种使用方式。 通常,它可以与传统的断点互换使用。 然而,在某些场景下,使用暂停程序 (Pause Program) 会更加合适。 让我们来看看这几个场景吧。

无响应的应用

如果你遇到 UI 冻结,那通常是由于 UI 线程被阻塞造成的。

The stack of the blocked UI thread shows what method it is currently executing

在这种情况下,暂停程序 (Pause Program) 可能会很有用,因为它允许你在应用无响应时暂停它并检查 UI 线程的调用堆栈。这通常足以诊断问题。

缺失的源代码

如前所述,暂停程序 (Pause Program) 允许你简单地忽略源代码, 而这些源代码可能对你来说本来就是缺失的。 虽然这种场景并不常见,但当你遇到时, 断点将无法提供帮助。这时,暂停程序 (Pause Program)发挥作用了!

如果你怀疑存在同步问题,比如死锁或活锁, 使用暂停程序 (Pause Program) 或许能帮助你找到引发问题的确切线程和锁。
The list of threads shows which threads have ended up in a deadlock

在这种情况下,让我们暂停程序并检查线程列表。 它会显示哪些线程被阻塞了。 通过导航到执行点,你还将看到它们被锁定在哪些临界区中。 这些信息可能有助于指引你找到解决方案。

附送单步调试小技巧一则

正如我前面提到的,暂停程序 (Pause Program) 会限制你对某些高级调试功能的访问。 如果你尝试在应用程序暂停时使用某些功能, 你可能会看到错误消息,告诉你无法在暂停操作后对方法求值 (Cannot evaluate methods after Pause action)
An error message saying 'Cannot evaluate methods after Pause'

然而,有一个绕过这个限制的方法。

在暂停应用程序后,继续执行任何单步调试操作。 步入 (Step Into)步过 (Step Over)都可以。 一旦完成,你会发现自己处于一个常规的调试会话中, 类似于使用断点暂停应用程序时的情况。 所有高级功能此时都可以使用了!

结尾

今天的内容就到这里!希望你觉得这些提示和技巧有用。

如果你还想了解关于 Java 调试的其他特定内容,请留言告诉我们!

本博文英文原作者:

image description

Discover more