首页 > Java > java教程 > 正文

调试不活动的应用程序

WBOY
发布: 2024-08-19 12:32:34
原创
971 人浏览过

阅读其他语言: English Español 中文

有许多调试器教程可以教您如何设置行断点、记录值或计算表达式。虽然这些知识本身就提供了许多用于调试应用程序的工具,但实际场景可能会更复杂一些,并且需要更高级的方法。

在本文中,我们将学习如何在没有太多设计知识的情况下找到导致 UI 冻结的代码,并实时修复错误代码。

问题

如果您想跟随,请首先克隆此存储库:https://github.com/flounder4130/debugger-example

假设您有一个复杂的应用程序,当您执行某些操作时该应用程序会崩溃。您知道如何重现错误,但困难在于您不知道代码的哪一部分负责此功能。

Depurando Aplicativos Inativos

在我们的示例应用程序中,当您单击按钮 N 时,就会发生睡眠。然而,要找到负责此操作的代码并不容易:

Depurando Aplicativos Inativos

让我们看看如何使用调试器来找到它。

方法断点

方法断点相对于行断点的优点是它们可以在整个类层次结构中使用。这对我们的例子有什么用?

如果您查看示例项目,您将看到所有操作类均派生自 Action 接口,并具有单个方法:perform()。

Depurando Aplicativos Inativos

只要调用派生方法之一,在此接口方法上设置方法断点就会挂起应用程序。要设置方法断点,请单击声明该方法的行。

启动调试器会话并单击按钮 N。应用程序在 ActionImpl14 中暂停。现在我们知道这个按钮对应的代码在哪里了。

Depurando Aplicativos Inativos

虽然在本文中我们的重点是查找错误,但当您想要了解某些内容在大型代码库中如何工作时,此技术也可以节省大量时间。

暂停应用程序

带有方法锁点的方法效果很好,但它是基于我们了解父接口的假设。如果这个假设是错误的,或者我们由于其他原因不能使用这种方法怎么办?

好吧,即使没有断点我们也可以做到这一点。单击按钮N,在应用程序锁定时,转到IntelliJ IDEA。从主菜单中,选择运行 | 调试操作 | 暂停程序

Depurando Aplicativos Inativos

应用程序将暂停,允许我们检查线程和变量选项卡中线程的当前状态。这让我们了解应用程序当前正在做什么。既然是加锁的,我们就可以识别加锁的方法,并追踪到调用的位置。

这种方法比更传统的线程转储有一些优势,我们很快就会介绍。例如,它以方便的方式提供有关变量的信息,并允许您控制进一步的程序执行。

注意:有关暂停程序的更多提示和技巧,请参阅无断点调试和Debugger.godMode()。

线程转储

最后,我们可以使用线程转储,这并不是严格意义上的调试器功能。无论您是否使用调试器,它都可用。

点击按钮N。当应用程序被锁定时,转到 IntelliJ IDEA。从主菜单中,选择运行 | 调试操作 | 获取线程转储

查看左侧的可用线程,在 AWT-EventQueue 下,您将看到导致问题的原因。

Depurando Aplicativos Inativos

线程转储的缺点是它们仅提供拍摄时程序状态的快照。您不能使用线程转储来探索变量或控制程序执行。

在我们的示例中,我们不需要诉诸线程转储。但是,我仍然想提一下这种技术,因为它在其他情况下也很有用,例如当您尝试调试在没有调试代理的情况下启动的应用程序时。

了解问题

无论调试技术如何,我们都会到达 ActionImpl14。在此类中,有人打算在单独的线程中完成工作,但将 Thread.start() 与 Thread.run() 混淆了,后者在与调用代码相同的线程中运行代码。

IntelliJ IDEA 的静态分析器甚至在设计时警告我们:

Depurando Aplicativos Inativos

在 UI 线程上调用执行繁重工作(或在本例中为大量睡眠)的方法,并阻止该方法直到该方法完成。这就是为什么我们在点击按钮N后一段时间内无法在UI中执行任何操作。

热插拔

现在我们已经找到了错误的原因,让我们解决问题。

我们可以停止程序,重新编译代码,然后再次运行它。然而,仅仅为了一个小小的改变而重新折叠整个应用程序并不总是很方便。

让我们以聪明的方式做到这一点。首先,使用建议的快速修复修复代码:

Depurando Aplicativos Inativos

代码准备好后,点击运行 | 调试操作 | 重新加载更改的类。将出现一条消息,确认新代码已到达虚拟机。

Depurando Aplicativos Inativos

让我们返回应用程序并检查一下。单击按钮 N 不再使应用程序崩溃。

提示:请记住 HotSwap 有其局限性。如果您对 HotSwap 的扩展功能感兴趣,那么看看 DCEVM 或 JRebel 等高级工具可能是个好主意。

概括

使用我们的推理和一些调试器功能,我们能够找到导致 UI 在我们的项目中冻结的代码。然后,我们继续修复代码,而不会浪费时间重新编译和重新部署,这在实际项目中可能非常耗时。

我希望您发现所描述的技术很有用。让我知道你的想法!

如果您对更多与调试和分析相关的文章感兴趣,请查看我的其他一些文章:

  • Debugger.godMode() – 使用调试器破解 JVM 应用程序
  • 调试器缓慢问题排查
  • 无断点调试
  • createDirectories() 有什么问题吗? - CPU 配置文件指南

以上是调试不活动的应用程序的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!