- 浏览: 659282 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
HkEndless:
不好意思,请问这确定是回调机制吗。你的例子中只是将接口的实现类 ...
Spring CallBack回调机制介绍 -
hanmiao:
写的真乱啊,完全不知所云...
Java如何调用可执行文件和批处理命令 -
junia_1:
junia_1 写道 shock: ...
为什么要使用EJB -
junia_1:
shock:
为什么要使用EJB -
coollifer:
不错
SQL Server数据导入到Oracle中的方法
目前可以用来调试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
发表评论
-
hibernate Restrictions用法 MatchMode.ANYWHERE
2012-07-14 15:50 3970方法 说明 Res ... -
URLClassLoader
2012-05-27 19:45 998This example shows how a serv ... -
MyClassLoader 自定义类加载器
2012-05-27 19:38 1524package demo; import java. ... -
Deal with big-endian and little-endian order
2011-12-25 19:17 1120Java virtual machine always use ... -
修改eclipse的背景色
2011-11-12 19:23 1114eclipse 操作界面默认颜色为白色。对于我们长期 ... -
多线程管道流输入输出模式
2011-11-07 07:23 1091import java.io.* ; class Send ... -
Java计数单字节双字节字符个数的例子
2011-10-26 14:29 1294/* 计数单双字符的个数并存储在Map对象中 ... -
常用内存数据库3
2011-10-24 00:24 15204.1.2 哪些场合适合使用其他的关系型数据库管 ... -
java字节码规则
2011-09-05 13:56 1253栈和局部变量操作 将常量压入栈的指令 aconst_nul ... -
Tomcat中限制ip访问
2011-08-23 21:40 1272Tomcat中限制ip访问是非常简单的,只需要编辑server ... -
一个Java程序员应该掌握的10项技能
2011-08-22 10:27 6211、语法:必须比较熟 ... -
2011 年 8 月 Java 开发人员新闻快讯
2011-08-18 18:59 837Java SE 7 发布了! 经过世界各地 Ja ... -
BlockingQueue
2011-08-13 09:59 718import java.util.concurrent.Arr ... -
eclipse中java项目转换为web项目
2011-07-27 18:29 898经常在eclipse中导入web项目时,出现转不了项目类型 ... -
Oracle官方Weblogic插件安装
2011-07-20 22:00 2881Installing Oracle Enterprise Pa ... -
Java集合HashSet-ArrayList-HashMap的线程同步控制方法和区别
2011-06-21 17:44 2321C ollections类中提供了多 ... -
关于java的集合类,以及HashMap中Set的用法
2011-06-21 17:35 1807import java.util.*; public c ... -
Java的动态代理实例
2011-06-16 03:44 1058首先写一个接口: package net.test.dyna ... -
Java如何调用可执行文件和批处理命令
2011-06-07 00:58 2351Java是种跨平台的语言,我们经常碰到需要通过Java调用wi ... -
jsp实现图片验证码的方法
2011-06-07 00:57 1393调用方法 <img src=&quo ...
相关推荐
Java调试技巧,特别是针对Eclipse的调试方法,是Java开发者必备的技能之一。在Java编程中,多线程编程是一个重要且复杂的主题,因为它允许程序同时执行多个任务,提高CPU的利用率,尤其对于网络和交互式应用至关重要...
Java调试是开发者日常工作中不可或缺的一部分,它涉及到对代码的深入理解和问题排查能力。在Java编程过程中,遇到程序出错或运行异常时,调试是找...因此,熟练掌握Java调试技巧对于任何Java开发者来说都是至关重要的。
本篇文章将深入探讨Java开发调试技巧以及Eclipse的快捷键使用方法,帮助开发者提高工作效率。 一、Eclipse基础操作与界面布局 Eclipse的界面分为几个主要部分:工作台(Workspace)、透视图(Perspective)、编辑器...
本文旨在深入探讨XPages的服务器端JavaScript/Java调试技巧,帮助初级开发者减少调试时间,专注于XPages开发的核心。 #### 客户端与服务器端JavaScript的区别 在XPages开发中,JavaScript扮演了核心角色,被分为...
通过熟练掌握调试技巧,我们可以更快地定位和解决问题,提升代码质量,从而提高整个项目的开发效率。因此,对于任何使用VS Code进行Java开发的人来说,深入理解和充分利用其内置的Java调试器是必不可少的技能。
### Java Debugging技巧详解 #### 一、条件断点 条件断点是一种特殊的断点类型,它允许开发者根据设定的条件来...通过这些详细的步骤和说明,开发者可以更加熟练地掌握Java调试技巧,从而提高编程效率和代码质量。
Java编程中的调试技巧是每个Java程序员必须掌握的关键技能,它能帮助我们快速定位并修复代码中的问题。在本文中,我们将探讨10个对Java程序员至关重要的调试技巧,以提高开发效率和代码质量。 1. **条件断点**:...
调试不仅可以查找到应用程序缺陷所在,还可以解决缺陷。对于Java程序员来说,他们不仅要学会如何在Eclipse里面开发像样的程序,更需要学会如何调试程序...本文介绍了Java程序员必知的10个调试技巧,保证让你受益匪浅!
Java编程实训中的异常处理机制是Java开发中至关重要的一部分,它允许...同时,掌握Java调试技巧也是提高开发效率和解决问题的关键,包括使用IDE的调试功能、设置断点、查看堆栈跟踪等,帮助定位和修复代码中的错误。
Eclipse调试Java的10个技巧是Java开发者们在使用Eclipse进行Java开发时的一些高级调试技巧。这些技巧可以帮助开发者更好地调试Java程序,提高开发效率和质量。 1. 条件断点 条件断点是Eclipse中的一种断点类型,它...
本文将详细介绍Java程序员必须了解的10个高效调试技巧,这些技巧不仅对有经验的程序员有极大帮助,同时也能辅助初学者提高调试能力。 ### 条件断点 条件断点是调试中的高级技巧之一。在编写涉及复杂逻辑的代码时,...
这份文档可能涵盖了如何设置断点、查看变量、跟踪调用路径等基本的Java调试技巧。在实际工作中,熟练掌握这些技能能帮助我们快速定位和修复问题。 总结,通过阅读《GWT揭秘》试读章节,我们可以了解到GWT项目的运行...
### Java调试技巧详解 在Java开发过程中,调试是不可或缺的一环。通过有效的调试技术,开发者可以迅速定位并解决代码中的问题,从而提高软件的质量和稳定性。本文将基于提供的标题、描述、标签及部分内容,深入探讨...
因此,虽然调试技巧可以通用,但结果可能需要在实际环境中验证。 总结,调试Java中的JavaScript代码可以通过多种方式实现,包括使用JShell、JDI、JSDT插件以及模拟Node.js调试。选择哪种方法取决于你的具体需求、...
Eclipse Debug 调试是一种实用的Java调试技巧,主要用于Eclipse操作讲述,讲述了多种调试技巧。下面是对Eclipse debug 调试的详细介绍: 一、断点调试 断点是调试中最基本的概念。在Eclipse中,可以在Java编辑区的...
在Java开发过程中,调试是确保程序正确性和性能优化的关键步骤之一。通过合理设置Java调试参数,开发者...在实际项目开发中,熟练掌握这些调试技巧对于解决复杂问题至关重要。希望本文能为你在Java开发旅程中提供帮助。
### JVM工具、参数调优与调试技巧 #### 一、JVM工具 ##### 1. jps:虚拟机进程状况工具 - **简介**:`jps` 是一个用于显示当前运行的所有Java虚拟机进程(JVMs)的简单工具。它会列出每个JVM的PID(进程ID)以及...
JavaScript是Web开发中不可或缺的一部分,它负责网页的交互逻辑和动态功能。然而,如同任何编程语言一样,...在不断学习和使用过程中,理解并熟练掌握各种调试技巧,将有助于提升作为一名JavaScript开发者的专业技能。
JAVA编程技巧完美版 李万鸿 JAVA语言博大精深,编java程序需要技巧,尤其是SSH2架构的项目,需要高超的编程艺术和深广的智慧。编程和调试需要全面考虑问题,要从系统的各个方面进行考虑,多角度分析问题,这样才能...