目前可以用来调试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中设置断点有三种方法。
- 在命名方法的项上设置断点。
- 在指定的源代码行数上设置断点。
- 在发生特定异常的时候。
当你的应用程序触发断点时,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.iteye.com。
<script type="text/javascript"></script><script src="/scripts/forum.js" type="text/javascript"></script><script src="/dwr/interface/ForumNotifications.js" type="text/javascript"></script>
分享到:
相关推荐
为了更好地支持 Java 应用程序的自动化测试,QTP 提供了专门的插件——Java Add-in。 Java Add-in 是一个扩展模块,它可以增强 QTP 对 Java 应用程序的支持能力。通过安装 Java Add-in,用户可以在 QTP 中创建针对 ...
《信息管理系统设计与开发——基于人工智能的项目实践》 在当今数字化时代,人工智能(AI)技术正在逐步渗透到各个行业中,其中包括信息化管理。本课程设计的主题是“信息管理系统”,旨在通过实际项目实践,让学生...
在这个Java实现中,训练集和测试数据来源于经典的机器学习教材——米歇尔的《机器学习》。这表明代码可能是针对书中的特定示例数据进行设计的,可能包括天气、湿度等因素对是否打网球的影响等经典案例。这些数据通常...
《Java实现的机器学习——数字手写识别系统详解》 在信息技术领域,机器学习作为人工智能的一个重要分支,已经深入到各个行业中,特别是在图像识别、自然语言处理等方面展现出了强大的潜力。本项目“machine-...
在你提供的“opencv-4.9.0+基础库”压缩包中,包含了OpenCV的特定版本——4.9.0,这是一个关键的更新版本,可能包含了一些新的特性和性能优化。 OpenCV库分为Debug和Release两个版本。Debug版本通常用于开发阶段,...
Badboy支持多种脚本语言,包括Java JUnit、Perl、Python等,这使得测试脚本可以轻松地集成到各种自动化测试框架中。对于开发人员和测试工程师来说,这意味着他们可以选择最熟悉的语言来编写和维护测试脚本,提高工作...
学生可能会使用Java实现监督学习算法,如线性回归、决策树或神经网络,或者无监督学习方法,如聚类或关联规则挖掘。 另一个可能的项目是自然语言处理(NLP),这是AI的一个分支,专注于理解和生成人类语言。在Java...
AutoRunner是黑盒测试工具,可以用来完成功能测试、回归测试、每日构建测试与自动回归测试等工作。是具有脚本语言的、提供针对脚本完善的跟踪和调试功能的、支持IE测试和Windows native测试的自动化测试工具,是目前...
AutoRunner是黑盒测试工具,可以用来完成功能测试、回归测试、每日构建测试与自动回归测试等工作。是具有脚本语言的、提供针对脚本完善的跟踪和调试功能的、支持IE测试和Windows native测试的自动化测试工具,是目前...
1. JUnit:Java平台上的单元测试框架,用于编写和运行可重复的测试。 2. Selenium:用于Web应用程序自动化测试,支持多种浏览器和编程语言。 3. Appium:跨平台移动应用自动化测试,适用于iOS和Android。 4. ...
安居客赛题包是全国大学生软件测试大赛中的一项竞赛题目,旨在锻炼和提升参赛者在软件测试领域的...通过这次大赛,学生们可以提升自身的专业素养,同时也能了解实际工作中的软件测试流程,为将来进入职场打下坚实基础。
在深入探讨Selenium IDE的基础知识之前,我们首先需要理解它的核心概念。 **Selenium IDE的基本概念:** 1. **录制与回放**:Selenium IDE的核心功能是其内置的录制器。它能捕捉用户的浏览器操作,将其转化为可...
**机器人框架调试器——深入解析与应用** 机器人框架(Robot Framework)是一款开源的通用测试自动化框架,它提供了关键字驱动的测试方法,适用于多种类型的测试,包括功能测试、验收测试、回归测试等。Robot ...
华为笔试题java微信小程序自动化测试——基于Appium & Python3 微信小程序自动化测试方案,基于Appium 移动端测试框架及多种测试用例管理框架,使得UI测试更易于实施。 技术方案选型: Appium + Python3 + Behave ...
它支持多种语言绑定,如Java、Python、C#等,并且被W3C采纳为Web标准,确保了跨浏览器的一致性。 2. **ChromeDriver的工作原理**: 当你运行包含ChromeDriver的自动化脚本时,它会启动一个新的Chrome浏览器实例,并...
Spark提供了统一的API,包括Scala、Java、Python和R语言接口,方便不同背景的开发人员使用。 2. **Spark组件**: - **Spark Core**:基础执行引擎,负责任务调度、内存管理、错误恢复和与其他模块的通信。 - **...
"2019年数维杯国赛题目.zip" 这个文件标题和描述都指向一个特定的竞赛——“2019年数维杯国赛”,这是一项可能涉及数学、数据科学或者编程技能的比赛。"zip" 文件格式表明这是一个压缩包,通常用于集合多个文件或...
在IDEA集成环境下,EasyClick与Java、Kotlin等语言的开发无缝对接,提供了一流的代码编辑和调试支持。它集成了调试器,允许开发者在运行脚本时实时查看变量状态,快速定位和修复问题。同时,插件的集成版本控制系统...
在本教程文档中,我们将聚焦于第十一章——“软件测试自动化”。这一章节主要探讨如何利用工具和技术提升软件测试的效率和准确性,减少人为错误,并在持续集成和持续交付的背景下,实现测试过程的自动化。 软件测试...
- **回归分析**:线性回归、非线性回归模型的建立与评估。 - **信号处理**:如傅里叶变换、小波变换等信号处理技术的应用。 - **图像分析**:介绍如何对图像进行滤波、分割、识别等操作。 #### 六、Creating ...