10 月 23 - 25 日,QCon 上海站即将召开,现在大会已开始正式报名,可以享受 8 折优惠 了解详情
写点什么

Java 调试——回归基础

  • 2007-12-02
  • 本文字数:2300 字

    阅读完需:约 8 分钟

目前可以用来调试 Java 应用程序的工具令人叹为观止。现代 IDE 提供了全功能的调试界面,并且像 GlassBox 这样的工具用 BCI(bytecode instrumentation)提供了关于应用程序运行时状态的更多信息。虽然你有时候会发现自己处于无法使用这些工具的境地,或许应用程序被部署在防火墙的另一端,不允许你远程调试;或许你正在客户那里,没有你喜欢的工具可用。现代调试工具使用的大多数信息和方法都由 JVM 自己提供,并具有控制这种信息而不用最新图形工具的一些方法。本文关注一些可用的调试方法,它们只使用 Java SDK(JDK)自带的那些工具。

JDB

JDK 携带的主要调试工具是 jdb,这是一种命令行调试器,它将附到一个在运行的 VM,并允许你设置断点(breakpoint)、逐步跟踪代码、检验变量并评估表达式的值。JRE 没有包括 JDB,因此你需要安装 JDK。

如果你知道如何利用 IDE 中内建的任何调试器调试 Java 应用程序,你就可以迅速地学会利用 JDB 进行调试。为了允许 JDB 或者任何调试器连接到一个在运行的 JVM,JVM 必须通过许多命令行参数来启动。这些参数促成 JVM 去加载和初始化调试库,配置传输并打开一个 socket。例如,要配置 VM 在端口 8000 监听调试连接,你应该使用类似于下面的命令行选项:

-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=8000

你现在可以利用下面的命令行用 JDB 连接:

jdb -attach 8000

或者在 Windows 上:

jdb -connect com.sun.jdi.SocketAttach:port=8000

一旦连接上,你应该看到 JDB 提示。

你现在连接到了 JVM,可以开始调试你的应用程序了。你想要做的第一件事可能是设置一些断点。在 JDB 中设置断点有三种方法。

  1. 在命名方法的项上设置断点。
  2. 在指定的源代码行数上设置断点。
  3. 在发生特定异常的时候。

当你的应用程序触发断点时,JVM 将中止执行,并等待你告诉它接下来要利用 JDB 做什么。你可以跳过去,进入到方法调用里面,检查本地变量,并评估表达式,为了获得一个可用命令的列表,可以输入 help 来得到它。

虽然利用 JDB 调试比用为你显示源代码行的图形调试器更慢,但是只要你访问源代码,就可以获得与利用 JDB 相同的效果。

不建议你通过调试参数运行产品应用程序,因为使用这些参数的时候,有一个性能和安全问题。但在测试、开发期间以及检查某类产品问题的时候,JDB 都是一种非常有用的工具。

关于 JDB 的更多信息,请见 Sun 的文档: http://java.sun.com/j2se/1.3/docs/tooldocs/win32/jdb.html

利用 Thread Dump

现代的 Java 和 Jave EE 应用程序有许多线程,它们全都彼此交互,并连接到外部系统。Java 提供了一种获取在 VM 中运行的所有线程的调用堆栈快照的方法。这个的输出称作 Thread Dump,它是大量的堆栈轨迹(每个线程一个),以及关于线程优先级和它持有或等待的任何锁或监视器的信息。

生成 Thread Dump 在不同的操作系统中做起来也不同。在 Windows 中,是在 JVM 运行的控制台窗口中按下 Ctrl-Break。对基于 Linux 和 Unix 的系统,则用 kill 命令将 SIGQUIT 发送到 JVM。这可以通过命令 kill – 3 完成,这里的 pid 是 JVM 的进程 ID。

现代的企业 Java 应用程序中,经常有大量的线程,它们中有许多都没起任何作用。你可以用许多种方式来辨别重要的线程。

  • 它们通常具有较长的相关堆栈轨迹。
  • 搜索已知的包名称(例如你应用程序中使用的包)。

线程持有或者等待的任何锁或者监视器都在轨迹中指定,因此死锁以及其他同步相关的问题,都可以通过分析哪些线程在等待或者持有哪些锁和监视器进行辨别。

在性能调优或者调试慢运行应用程序时,它对相隔几秒钟生成许多 Thread Dump 并对它们进行比较会很有利。这样让你知道应用程序的哪些部分正在缓慢地运行着,而不必使用更高级的性能分析工具。

JMX

从 Java SE 5 开始,Sun 给 JVM 运行时信息提供了 JMX API 作为 Java SE 的一部分,Sun 还提供了一种工具,用来在一个正运行的 JVM 内部查询 MBeans。这个工具是 jconsole,并且就像 jdb 一样,它是与 JDK 捆绑在一起的。

为了允许 jconsole 连接到你的 VM,你需要增加许多命令行参数。

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=20001
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

当你运行 jconsole 时,它将在你的机器上侦测 VM 运行,并问你想要连接到哪一个。一旦你连接上了,摘要(Summary)屏幕就会显示大量关于 VM 的信息,让你访问使用关于它线程的运行时信息、堆的使用(Heap Usage),以及所有变得能通过 JMX MBeans 使用的信息。通过将 MBeans 增加到你的应用程序中,有可能使你的应用程序信息能通过 JMX 控制台以及用 JMX 接口收集它们信息的其他工具来使用。利用 JMX 将监视功能增加到你的应用程序,则是另一篇文章的主题了。

关于使用 jconsole 的更多信息,请见: http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html

信息唾手可得

这些工具虽然不完整,或者不像你习以为常的工具那么容易使用,但它们仍然提供了很多你可以用来分析和调试你应用程序的信息。基本熟悉了它们之后,就可以快速解决问题,否则要花数天进行调查,因此值得花时间去体验它们,并了解它们是如何工作的。


译者简介:俞黎敏(网名:阿敏总司令),技术顾问,自由撰稿人,开源爱好者,曾经参与 Spring 中文论坛组织 Spring 2.0 Reference 中文版的技术审校和满江红开源组织 Seam 1.2.1 Reference 的中文翻译工作;另外他还翻译了《CSS: The Missing Manual》、《Java Persistence with Hibernate》等书籍,并担任 CSDN、CJSDN、Dev2Dev、Matrix、JavaWorldTW 等技术网站 Java 论坛版主。他的博客是: http://YuLimin.JavaEye.com

2007-12-02 18:565010

评论

发布
暂无评论
发现更多内容

WebGIS 开发框架的调试工具

北京木奇移动技术有限公司

软件外包公司 webGIS开发 GIS开发

GPUStack v0.5:模型Catalog、图生图功能上线,多维优化全面提升产品能力与使用体验

GPUStack

人工智能 大模型 模型推理 生成式AI GPU集群

从被动救火到主动预防,StarRocks 监控与告警全攻略

StarRocks

数据库 数据处理 StarRocks 数据查询 物化视图

等保二级测评国家标准详解

黑龙江陆陆信息测评部

WebGIS 开发框架及性能

北京木奇移动技术有限公司

软件外包公司 webGIS开发 webGIS软件外包

Coze工作流+DeepSeek模型,躺着管理100个账号的终极秘籍

测试人

人工智能

案例分享|基于 Altair SimSolid 的大型通用工装结构力学仿真分析及试验对标

Altair RapidMiner

仿真 CAE 有限元仿真 SimSolid 无网格技术

国产法律AI亮相香港!爱问法AI参加香港国际创科展InnoEX

极客天地

GPUStack v0.6超重磅更新:vLLM多机分布式、昇腾MindIE、模型兼容性检测、模型故障自动恢复,上百项增强打造最好用的模型推理平台

GPUStack

人工智能 大模型 模型推理 生成式AI GPU集群

强强联合,智见未来:麦杰科技将携手视源股份亮相数字中国,以“集团级生产管理平台”赋能数实融合

麦杰研究院

Go Context 最佳实践

俞凡

golang 最佳实践

数据分析与AI|面对 RapidMiner 一万多行汉化翻译难题:中国工程师如何直接实现自动翻译?

Altair RapidMiner

AI 数据分析 RapidMiner 人工智能平台

Web3项目开发框架及性能

北京木奇移动技术有限公司

软件外包公司 web3开发 web3外包公司

企业AI落地指南系列文章:AI应用开发平台选型六大核心评估维度

UniverAI智宇苍穹

评估标准 开发平台 AI工程化 企业 AI 应用 AI落地

过来人给1-3 年技术新人的几点小小的建议,帮助你提升职场竞争力

安全乐谷

找工作 招聘 简历 实习 校招

行业热点丨可持续建筑新纪元:GFRP如何重塑混凝土的未来

Altair RapidMiner

仿真 hyperworks GFRP 建筑仿真软件 可持续建筑

演讲实录:中小企业如何快速构建AI应用?

阿里云大数据AI技术

人工智能 云计算 大数据 阿里云

Microchip推出面向边缘人工智能应用的新型高密度电源模块MCPF1412

新消费日报

(JS实现编辑DWG)AI实现网页CAD多行文本开发

WEB CAD SDK

AI编程 网页CAD 在线CAD AI协助CAD二次开发

时序数据库 TDengine 助力石油石化业务, 平滑接替 Oracle 数据库

TDengine

数据库 tdengine 时序数据库

解决方案评测|告别复杂配置!基于阿里云云原生应用开发平台CAP快速部署Bolt.diy

Geek_b7ce72

WebGIS 开发的性能优化

北京木奇移动技术有限公司

软件外包公司 webGIS开发 webGIS软件外包

当东哥开始卷外卖:奶茶砍半价比拼多多还狠!附京东面试题

王中阳Go

面经 京东

AI与机器人外科手术:如何用智能化技术提升手术精度与安全性?

天津汇柏科技有限公司

人工智能 机器人 AI 人工智能

Python 实战 | 1688 商品详情 API 接口调用全流程解析

tbapi

1688商品详情接口 1688API 1688数据采集 1688商品详情采集

人工智能与智能教育:AI如何帮助实现个性化学习与在线教育的未来?

天津汇柏科技有限公司

人工智能 AI 人工智能

Python 实战!手把手教你调用淘宝商品列表 API 接口

tbapi

淘宝商品详情接口 淘宝数据采集 淘宝API 天猫商品数据采集 淘宝商品详情API

智象未来x商汤大装置:全栈赋能全球首个开放使用视频生成DiT模型

Lily

Dify+DeepSeek实战教程!企业级 AI 文档库本地化部署,数据安全与智能检索我都要

北京好雨科技有限公司

知识库 rainbond 企业号 4 月 PK 榜 dify DeepSeek

大胆试错、持续推进,拓展 GenAI 在客户服务领域的新场景

亚马逊云科技 (Amazon Web Services)

三级等保的法定审核周期与形式

黑龙江陆陆信息测评部

Java调试——回归基础_Java_Anonymity Reagan_InfoQ精选文章