- 浏览: 847218 次
- 性别:
- 来自: 草帽海贼团
文章分类
最新评论
-
大维啊:
估计只有你自己能明白
Java安全沙箱机制 -
moonljt521:
第五种方式,如果构造里想传入参数怎么做,例如android的 ...
单例模式的七种写法 -
javaDADY:
怎么感觉在讨论茴香豆的茴字有几种写法?
单例模式的七种写法 -
Wallen_Han:
Mr.Cheney 写道这样的:Mr.Cheney 写道还有一 ...
单例模式的七种写法 -
Wallen_Han:
60love5 写道第三种稍微有点Java基础就知道是错的,被 ...
单例模式的七种写法
我是一个debug控,很少写单元测试(不是我不想写),每次写完代码我都要把我的代码debug走一遍,这样才放心,debug也是我阅读别人代码的利器,同时我也经常用它来调试错误。
因为上家公司是做CS程序的,本地debug很方便, server和client启动也不是很慢,所以用debug调试和开发是一件很方便的事情。新公司是做互联网的,在本地debug调试机子承受不起,这对于我这个喜欢debug的人来说,总感觉不舒服,于是有了下面的内容。
远程debug
编译参数支持
除了程序员编写的程序对应的字节码之外,class文件中还包含有大量的调试信息,这些信息是用于记录每一个JVM指令对应着怎样的代码,每个变量的声明位置,以及每个函数调用、数值计算对应的源代码中的行号。所以,我们必须在编译的时候加上“-Ddebug=true”参数,让编译器保留debug信息,如果使用的maven编译,可以在maven环境变量上添加。
JVM启动参数支持
修改你要远程debug机子的JVM的启动参数,加上:“-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=4000,server=y,suspend=n”;开始看到网上说的什么maven参数,我以为修改maven环境变量,一想不对,因为maven只有在它的生命周期内使用的JVM,真正运行JVM的是servlet/web容器。我使用的是resin,所以我在resin bin目录下修改httpd.sh文件即可。
eclipse设置参数
打开debug configuration,如图所示:
在remote java application新建一个debug,如图所示:
填写如下参数:
Name可以随便填,只是一个名称ID
Project要选对,你想看debug哪个源代码工程就选哪个,如果选错的话,debug找不到对应的类,就会出现source not found错误。
Connection type,连接类型选attach,而不是listen,这是一个相反的概念。
Host就是10.3.20.139,这是你要远程debug服务器的IP地址。
Port,应该是socket阻塞的端口,在JVM里(实际应用中是web/servlet容器,由它来启动JVM)配置什么这里就填什么,这里已经配置好了是4000。
填完之后直接debug即可。
注意:由于java的debug框架能够看到所有线程的状态(eclipse 3.6的debug还提供了阻塞整个JVM的功能),而且是基于socket端口方式(shared memory 方式请参考http://www.ibm.com/developerworks/cn/java/j-lo-jpda1/index.html),为避免冲突,一次只能有一个connection,也就是如果有一个attach上了,其他人就attach不上了。
还有一点就是,其他机子上的操作也会触发断点的阻塞,也就是说如果你attach上了,你就拥有了远程JVM的所有行为,别人的请求也会反映到你的断点上。这就要求我们最好只在自己正在开发的地方打断点,不要在公共入口处打断点,不然别人还以为是性能限制呢。
Debug的好处
能够时刻跟踪代码的执行流程,不用为了看分支走向或者看一个对象在运行时的状态写那么多log了。
Debug有一个线程列表,打了断点能够看到线程栈,一个方法调用就是一个栈帧,它为我们提供了一个线程里详细的方法调用顺序,利于我们理解源代码,也利于调试错误(可以打一个异常点,JVM发生异常之前会阻塞)。
另外,就算远程attach上了,eclipse可能还是很卡,因为它必须保持跟服务器端的连接,而且要处理一些调试信息,这时候可以对服务器优化一下,因为如果是作为内部测试机的话,可以把连接数目什么的限制一下。
Debug热加载
昨天弄了一个本地resin,然后采用远程debug的方式调试,结果我发现我修改方法里的code也能即时生效,我很郁闷,因为我是采用eclipse exporting war方式部署到webapps里的,我在eclipse修改了代码,最多也是编译到指定的目录,为什么能在resin里即时生效呢?我查看了webapps下面的class文件,发现它一直没有变,这就是说它直接修改的是内存中的数据,而且,只有在debug模式下才可以即时生效,到底是为什么呢?
在网上找到一些资料,以作记录:
HotSwap:“HotSwap”是JPDA(Java Platform Debugger Architecture)中的一个特性,JPDA增强是自Java 2 SDK1.4新增的功能。HotSwap允许将JVM中的类定义替换为新的类定义,这就允许开发人员在debug时,将修改过的class替换JVM中旧有的class,无需重新启动服务器。不过,目前HotSwap只支持对方法body的修改,不支持对类和方法签名的修改(比如修改类名,方法名,方法参数等)。考虑这些限制,也是有理由的,替换类定义,就需要新类和旧类之间有一个关联,这里关联就是类的全名(或许还有其他信息),类名都改了,就不知道替换哪个类了。至于方法签名的修改,应该是考虑到运行时方法的调用,通过方法签名替换已有的方法调用。
关于热部署、热加载和概念:
热部署:容器状态在运行时重新部署整个项目。这种情况下一般整个内存会清空,重新加载,这种方式可能会造成sessin丢失等情况。tomcat 6确实可以热部署了,而且会话也没丢。
热加载:Debug模式支持热加载。容器状态在运行时重新加载改变编译后的类。在这种情况下内存不会清空,sessin不会丢失,但容易造成内存溢出,或者找不到方法。
=========================================================================================
2011年8月2日添加
在网上看到很多人说jrebel可以实现新增java类和方法也无需重启应用服务器即可生效的功能,包括添加jar包、修改hibernate配置文件等等,于是我下了一个破解版,然后在jvm启动时添加如下启动参数-noverify -javaagent:<yourpath>/jrebel.jar,一开始就发现一个显著的缺点,因为它监视着WEB-INF/classes和classpath等,所以必须把修改之后的class文件放在对应的目录下,jrebel才检测得到进而采取热加载,而不像debug模式那样,直接替换内存中的方法body。另外,刚开始修改了方法body,更新WEB-INF/classes下面的class文件,jrebel重新检测到并装载,但是第二次新建了一个public的字段和一个方法,就不行了,不知道是我配置不对,还是它确实不像传言中能够实现新增java类和方法也能即时生效。
最后,不知道有人用过jetty吗?配合JEE版本的eclipse不知道能不能实现新增java类和方法也无需重启应用服务器即可生效的功能??
评论
不过研究了jvmTI jdi东东;
可以专门搞个标题;
现在回头再看时, 有些苦笑。
应该说debug代表了满腔热情, 不过, 漂亮地完成一件事只有热情还是不够的。
单元测试和Log分析是这方面的很好,很专业的选择。
单元测试?不过可能你误会了,单元测试和debug没有冲突的,我只是在刚写完代码debug,调试错误才debug,而单元测试是根本,侧重点不一样的。
发表评论
-
解决eclipse每次启动maven很慢
2012-11-14 12:31 17857好久没有用eclipse了,离开人人后maven私有仓库当然也 ... -
泛型のwhy&how
2011-07-21 18:35 1412Why,Java为什么需要 ... -
【分享】Findbugs反模式
2011-05-20 09:54 5265FindBugs解释 FindBugs 是一个静态分 ... -
Findbugs反模式
2011-05-20 09:46 0FindBugs介绍 FindBugs 是一个静态分 ... -
正则表达式Mini版
2010-10-27 12:14 13711.句点符号:. 条件 ... -
Eclipse下jar包版本不一致等常见问题
2010-09-15 20:18 7990我借这个平台简单说说Eclipse下配置环境需要注意的几点 ... -
我承认我没有if(xxx != null)
2010-09-08 12:08 3018昨天正在编码兴头时 ... -
jtextfield限制字数与数字输入
2010-02-21 15:40 64import javax.swing.text.*; p ... -
Swing线程机制以及invokeLater和invokeAndWait
2009-09-14 11:05 7119本人最近想写一个仿QQ,初学Swing对线程机制不太了解,所以 ... -
在重写了对象的equals方法后,还需要重写hashCode方法吗?
2009-08-19 21:08 2035首先说建议的情况: 比如你的对象想放到Set集合或者是想作为 ... -
第五惑:初始化和动态绑定之间的小小冲突
2009-04-04 23:46 1241今天骑车去都江堰了,很累很累,没准备好今天该发什么Tips,所 ... -
第四惑:属性是否被动态绑定?
2009-04-03 17:11 1161众所周知,方法可以被动态绑定,在子类被向上转型为父类时,虚拟机 ... -
第三惑:类型被动使用举例
2009-04-02 13:04 1424当类型属于被动使用的 ... -
第二惑:类型在没有被完全初始化之前就生成实例对象所表现的情况
2009-04-01 13:41 1487public class MainTest { publi ... -
第一惑:类初始化时,final修饰的静态字段的表现方式
2009-03-31 16:27 1836计划从今天开始,模仿一下jythoner大哥,不过不是Java ... -
Java动态绑定虚拟机实现
2009-03-25 20:19 1725今天在51CTO看到一篇很好的介绍Java动态绑定的文章。先转 ... -
Java虚拟机简单介绍
2009-03-25 20:17 110请参考:http://cantellow.iteye.com/ ... -
Java夜未眠·经典句子选载
2009-03-25 20:16 2852最近在读前辈蔡学镛《Java夜未眠·程序员的心声》,几天就看完 ... -
代码签名和认证
2009-03-25 20:06 1769要对一段代码作担保或 ... -
Java安全沙箱机制
2009-03-25 20:05 4640说明,本文部分内容转 ...
相关推荐
【标题】: "DEBUG调试工具详解与应用实践" 【描述】: 本文深入探讨了DEBUG这一经典的调试工具,包括其在汇编语言程序设计中的重要角色。内容涵盖基础的调试命令,以及如何在实验环境中使用DEBUG进行程序调试,旨在...
根据提供的文件信息,本文将对“debug命令.txt”中的知识点进行详细解读,主要涉及的是针对“完美世界”这款单机游戏中的调试命令及其用途。这些命令对于深入理解游戏机制、优化游戏体验以及辅助游戏测试等方面具有...
原生的Unity UnityEngine.Debug类提供了丰富的调试工具,如Log、LogError、LogWarning等方法,用于输出信息到控制台。然而,在发布游戏时,这些调试信息通常需要关闭,以减少性能损耗和避免泄露敏感信息。本项目就是...
本文档主要介绍了qcom高通平台qcat音频分析文档的相关知识点,涵盖了音频分析、音频处理、音频媒体服务、音视频媒体服务、动态debug控制、子系统管理等领域。 一、音频分析 qcat音频分析文档提供了音频分析的相关...
- `debugfs_create_u8`、`debugfs_create_u16`、`debugfs_create_u32`、`debugfs_create_u64`、`debugfs_create_ulong`:用于创建表示无符号整数的debugfs文件。 - `debugfs_create_x8`、`debugfs_create_x16`、`...
RISC-V Debug 手册中文版 RISC-V 是一个开源的指令集架构(ISA),它提供了一个高度可扩展的架构,可以满足不同的应用需求。RISC-V Debug 手册中文版是 RISC-V 官方提供的一个 Debug 手册,旨在帮助开发者和测试者...
在使用IntelliJ IDEA(IDEA)作为开发环境,基于Spring Boot框架进行开发时,有时候我们需要开启debug模式来调试代码,查找程序中的错误或者优化逻辑。以下将详细介绍如何在mac操作系统下开启Spring Boot的debug模式...
"DEBUG32.TXT"可能是debug32的使用手册或者帮助文档,包含了工具的功能介绍、操作指南、快捷键列表和常见问题解答。这对于初学者来说是非常宝贵的资源,他们可以从中学习如何有效地利用debug32进行汇编开发。 ...
标题中的“Flex Debug-debug版本的安装.exe”指的是Adobe Flex Debugging版本的安装程序。Flex是Adobe公司开发的一个开源框架,用于构建富互联网应用程序(RIA),它基于ActionScript和MXML,通常与Flash Player或...
RISC-V Debug Specification为RISC-V处理器提供了统一的调试接口和协议,以便开发者可以为基于RISC-V ISA的硬件实现调试功能。 文档标题“riscv-debug-spec-0.11nov12”指的是RISC-V Debug Specification的版本号为...
总之,"webgl-debug.js"是WebGL开发中的一个强大工具,它通过增强错误报告和调试功能,使得原本复杂的WebGL编程变得更加可控和高效。结合"index.html"和"index.js",开发者可以创建出具有强大图形功能且经过充分调试...
**Informatica 运用Debug调试** 在数据集成领域,Informatica是一个强大的ETL(Extract, Transform, Load)工具,用于从各种数据源提取数据、进行转换处理,并加载到目标系统中。在开发和维护复杂的Informatica工作...
RISC-V Debug Support Version 1.0.0-STABLE 中文版 RISC-V Debug Support Version 1.0.0-STABLE 是一份关于 RISC-V 调试支持的技术规格文档,该文档提供了 RISC-V 调试模块(DM)的详细说明和技术规范。 1. 简介 ...
在Unity游戏开发中,Debug GUI(调试图形用户界面)是一个非常重要的工具,它允许开发者在游戏运行时查看和控制各种变量、数据以及功能。当您面对"debugGUI.zip"这个压缩包时,我们可以推测其中包含了用于调试Unity...
MyEclipse Debug 调试步骤总结 MyEclipse Debug 调试是 Java Web 项目开发中非常重要的一步,正确的 Debug 调试可以帮助开发者快速地定位和解决问题。本文将总结 MyEclipse Debug 调试步骤,帮助开发者快速上手使用...
"H3C-DEBUG_基础常识.rar"这个压缩包文件显然包含了关于H3C设备调试的基础知识,主要聚焦在DEBUG功能的使用上。DEBUG是网络工程师在排查问题、优化网络性能时常用的一种诊断工具。以下将详细介绍DEBUG的基本概念、...
### 命令行Debug命令详解 #### 一、概览 `Debug`是一个功能强大的命令行工具,主要用于测试和调试MS-DOS可执行文件。它允许用户在低级环境中控制和修改计算机内存,以及执行各种操作,如汇编、反汇编、内存读写、...
本篇文章将深入探讨如何让Unity的Debug输出显示在游戏场景中,这对于实时查看和分析程序状态非常有帮助。 首先,我们需要了解Unity中的Debug.Log()函数。这是Unity内置的一种调试工具,用于在控制台输出文本信息。...
`DebugLog`是一个自定义的日志工具类,它扩展了Android原生的`Log`类,提供了更加丰富的日志输出功能,方便我们在调试应用时获取更详细的信息。本篇文章将深入探讨`DebugLog`的实现原理及其在调试过程中的作用。 `...