`

Java调试技巧

    博客分类:
  • Java
阅读更多

目前可以用来调试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

信息唾手可得

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

 

 

     用Java 这么久,说来惭愧,大部分情况下使用的调试语句是:System.out.println("value:"+value);这种形式,这两天看了些关于java调试技巧的东西,总结一下,以后要积极使用:
一:一种很简单的方法就是使用一个boolean量如:debugMode,需要看看程序的输出时可以使用:if(debugMode)System.out.println("..");
      在项目完毕后把debugMode变量设为false;
     这种方法的不足是:为了启动或者禁止debug,必须改动代码
二:
    一个比上述方法稍好的是:使用java -D:如:java -Ddebug=true MyClass,
    在使用这种方法时,必须在你所有的class中添加System.getProperty("debug")来取得调试标志,这样第一种方法的使用,就改为:
    public static final boolean debug;
    static{
       String sDebug=System.getProperty("debug");
       if(sDebug!=null && sDebug.equalsIngnoreCase("true"))
          debug=true;
       else
          debug = false;
    }
    这样在不更改source code的情况下可以直接修改调试标志,但是这样不够灵活,比如你不能指定哪一部分使用调试功能,而只是
    要使用调试功能就必须在代码的全部使用,这样就引出了第三种调试方法,可以定义一个用于调试的类。
三:
   public class DebugManager {

 public static final String SYSTEM_DEBUG_KEY="system.Debug";
 public static final boolean debug;
 static {
     debug = toBoolean(SYSTEM_DEBUG_KEY);
 }
 private static boolean toBoolean(String key){
  boolean debug;
  String sDebug = System.getProperty(key);
  if(sDebug != null && sDebug.equalsIgnoreCase("true"))
   debug = true;
  else
   debug =false;
  return debug;
 }
 
 public static boolean getSystemDebug(){
  return debug;
 }
 public static boolean getSystemDebug(String applicationKey) {
  if(debug || toBoolean(applicationKey))
   return true;
  else
   return false;
 }
}

这样对于一个application(Test)可以着牙功能调用:
   boolean debug =DebugManager.getSystemDebug(applicationKey);
要打开Test的调试功能,只需:
  java -DTest.Debug=true Test
  当然这个类可以进行进一步扩展,比如将其变为日志管理,控制调试信息的输出位置等
四:
   使用断言
   断言是Merlin(JDK 1.4)中一项新功能,默认情况下不使用断言,但是programmer可以在任何时候enable或者disable这项功能,
   从而可以在测试时启用断言验证,而在部署时禁用断言验证,而程序运行时若用户碰到问题时再重新启用断言。
   断言检查,失败时不会抛出Exception,而是抛出AssertionError,
   1,断言的两种语法形式:
     (1)assert booleanExpression;
      (2) assert boolExpression:message; //message将作为错误抛出后的结果显示
   assert必须位AssertTest
 于可执行快中,不能将assert和实例的类变量一起使用,但可以将其放在任何方法内。
   2,启用断言:
   编译:javac -source 1.4 AssertTest.java
   运行:java -ea AssertTest (参数)
   -ea是启用断言的简易方法,但是-ea不能用于系统类,
   (1)若要对系统类使用断言:则需:-enablesystemassertions,或者-esa
   (2)若要对这个package启用断言:要在-ea后加(:,package的名字,...)如对test.util包及其所有的
   子包启用断言,则可以java -ea:test.util... AssertTest

分享到:
评论

相关推荐

    Java 调试技巧

    Java调试技巧,特别是针对Eclipse的调试方法,是Java开发者必备的技能之一。在Java编程中,多线程编程是一个重要且复杂的主题,因为它允许程序同时执行多个任务,提高CPU的利用率,尤其对于网络和交互式应用至关重要...

    javajava调试java调试java调试java调试

    Java调试是开发者日常工作中不可或缺的一部分,它涉及到对代码的深入理解和问题排查能力。在Java编程过程中,遇到程序出错或运行异常时,调试是找...因此,熟练掌握Java调试技巧对于任何Java开发者来说都是至关重要的。

    java开发调试技巧及Eclipse快捷键使用方法

    本篇文章将深入探讨Java开发调试技巧以及Eclipse的快捷键使用方法,帮助开发者提高工作效率。 一、Eclipse基础操作与界面布局 Eclipse的界面分为几个主要部分:工作台(Workspace)、透视图(Perspective)、编辑器...

    XPages 基本调试技巧

    本文旨在深入探讨XPages的服务器端JavaScript/Java调试技巧,帮助初级开发者减少调试时间,专注于XPages开发的核心。 #### 客户端与服务器端JavaScript的区别 在XPages开发中,JavaScript扮演了核心角色,被分为...

    VisualStudioCode的Java调试器

    通过熟练掌握调试技巧,我们可以更快地定位和解决问题,提升代码质量,从而提高整个项目的开发效率。因此,对于任何使用VS Code进行Java开发的人来说,深入理解和充分利用其内置的Java调试器是必不可少的技能。

    java_debug调试.

    ### Java Debugging技巧详解 #### 一、条件断点 条件断点是一种特殊的断点类型,它允许开发者根据设定的条件来...通过这些详细的步骤和说明,开发者可以更加熟练地掌握Java调试技巧,从而提高编程效率和代码质量。

    Java程序员应该知道的10个调试技巧

    Java编程中的调试技巧是每个Java程序员必须掌握的关键技能,它能帮助我们快速定位并修复代码中的问题。在本文中,我们将探讨10个对Java程序员至关重要的调试技巧,以提高开发效率和代码质量。 1. **条件断点**:...

    Java程序员应该知道的调试技巧

    调试不仅可以查找到应用程序缺陷所在,还可以解决缺陷。对于Java程序员来说,他们不仅要学会如何在Eclipse里面开发像样的程序,更需要学会如何调试程序...本文介绍了Java程序员必知的10个调试技巧,保证让你受益匪浅!

    Java程序员必须知道的10个调试技巧,必转

    Java编程中的调试技巧是提升开发效率的关键,尤其对于有经验的程序员来说,熟练掌握调试方法可以更快地定位和解决问题。以下是从标题、描述和部分内容中提取的10个必备调试技巧: 1. **条件断点**:在代码的特定行...

    Java编程实训 Java开发基础入门教程1-09 Java异常处理机制和调试(共32页).pptx

    Java编程实训中的异常处理机制是Java开发中至关重要的一部分,它允许...同时,掌握Java调试技巧也是提高开发效率和解决问题的关键,包括使用IDE的调试功能、设置断点、查看堆栈跟踪等,帮助定位和修复代码中的错误。

    eclipse调试java的10个技巧

    Eclipse调试Java的10个技巧是Java开发者们在使用Eclipse进行Java开发时的一些高级调试技巧。这些技巧可以帮助开发者更好地调试Java程序,提高开发效率和质量。 1. 条件断点 条件断点是Eclipse中的一种断点类型,它...

    《GWT揭秘》试读:运行调试项目

    这份文档可能涵盖了如何设置断点、查看变量、跟踪调用路径等基本的Java调试技巧。在实际工作中,熟练掌握这些技能能帮助我们快速定位和修复问题。 总结,通过阅读《GWT揭秘》试读章节,我们可以了解到GWT项目的运行...

    java how to debug

    ### Java调试技巧详解 在Java开发过程中,调试是不可或缺的一环。通过有效的调试技术,开发者可以迅速定位并解决代码中的问题,从而提高软件的质量和稳定性。本文将基于提供的标题、描述、标签及部分内容,深入探讨...

    java js引擎调试js代码

    因此,虽然调试技巧可以通用,但结果可能需要在实际环境中验证。 总结,调试Java中的JavaScript代码可以通过多种方式实现,包括使用JShell、JDI、JSDT插件以及模拟Node.js调试。选择哪种方法取决于你的具体需求、...

    Eclipse debug 调试

    Eclipse Debug 调试是一种实用的Java调试技巧,主要用于Eclipse操作讲述,讲述了多种调试技巧。下面是对Eclipse debug 调试的详细介绍: 一、断点调试 断点是调试中最基本的概念。在Eclipse中,可以在Java编辑区的...

    java调试参数

    在Java开发过程中,调试是确保程序正确性和性能优化的关键步骤之一。通过合理设置Java调试参数,开发者...在实际项目开发中,熟练掌握这些调试技巧对于解决复杂问题至关重要。希望本文能为你在Java开发旅程中提供帮助。

    jvm工具、参数调优&调试技巧

    ### JVM工具、参数调优与调试技巧 #### 一、JVM工具 ##### 1. jps:虚拟机进程状况工具 - **简介**:`jps` 是一个用于显示当前运行的所有Java虚拟机进程(JVMs)的简单工具。它会列出每个JVM的PID(进程ID)以及...

    java script 调试器

    JavaScript是Web开发中不可或缺的一部分,它负责网页的交互逻辑和动态功能。然而,如同任何编程语言一样,...在不断学习和使用过程中,理解并熟练掌握各种调试技巧,将有助于提升作为一名JavaScript开发者的专业技能。

    JAVA编程技巧完美版

    JAVA编程技巧完美版 李万鸿 JAVA语言博大精深,编java程序需要技巧,尤其是SSH2架构的项目,需要高超的编程艺术和深广的智慧。编程和调试需要全面考虑问题,要从系统的各个方面进行考虑,多角度分析问题,这样才能...

Global site tag (gtag.js) - Google Analytics