- 浏览: 842609 次
- 性别:
- 来自: 草帽海贼团
文章分类
最新评论
-
大维啊:
估计只有你自己能明白
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 17790好久没有用eclipse了,离开人人后maven私有仓库当然也 ... -
泛型のwhy&how
2011-07-21 18:35 1374Why,Java为什么需要 ... -
【分享】Findbugs反模式
2011-05-20 09:54 5231FindBugs解释 FindBugs 是一个静态分 ... -
Findbugs反模式
2011-05-20 09:46 0FindBugs介绍 FindBugs 是一个静态分 ... -
正则表达式Mini版
2010-10-27 12:14 13221.句点符号:. 条件 ... -
Eclipse下jar包版本不一致等常见问题
2010-09-15 20:18 7949我借这个平台简单说说Eclipse下配置环境需要注意的几点 ... -
我承认我没有if(xxx != null)
2010-09-08 12:08 2919昨天正在编码兴头时 ... -
jtextfield限制字数与数字输入
2010-02-21 15:40 64import javax.swing.text.*; p ... -
Swing线程机制以及invokeLater和invokeAndWait
2009-09-14 11:05 7060本人最近想写一个仿QQ,初学Swing对线程机制不太了解,所以 ... -
在重写了对象的equals方法后,还需要重写hashCode方法吗?
2009-08-19 21:08 1974首先说建议的情况: 比如你的对象想放到Set集合或者是想作为 ... -
第五惑:初始化和动态绑定之间的小小冲突
2009-04-04 23:46 1197今天骑车去都江堰了,很累很累,没准备好今天该发什么Tips,所 ... -
第四惑:属性是否被动态绑定?
2009-04-03 17:11 1125众所周知,方法可以被动态绑定,在子类被向上转型为父类时,虚拟机 ... -
第三惑:类型被动使用举例
2009-04-02 13:04 1387当类型属于被动使用的 ... -
第二惑:类型在没有被完全初始化之前就生成实例对象所表现的情况
2009-04-01 13:41 1454public class MainTest { publi ... -
第一惑:类初始化时,final修饰的静态字段的表现方式
2009-03-31 16:27 1799计划从今天开始,模仿一下jythoner大哥,不过不是Java ... -
Java动态绑定虚拟机实现
2009-03-25 20:19 1686今天在51CTO看到一篇很好的介绍Java动态绑定的文章。先转 ... -
Java虚拟机简单介绍
2009-03-25 20:17 110请参考:http://cantellow.iteye.com/ ... -
Java夜未眠·经典句子选载
2009-03-25 20:16 2780最近在读前辈蔡学镛《Java夜未眠·程序员的心声》,几天就看完 ... -
代码签名和认证
2009-03-25 20:06 1730要对一段代码作担保或 ... -
Java安全沙箱机制
2009-03-25 20:05 4587说明,本文部分内容转 ...
相关推荐
debug的一些常用命令,很详细.包含很多基础的实验(本人觉得光是里面附录离得内容就值得下载了)
完美世界单机 debug命令 喜欢玩完美的可以来看看啊
重新封装原生UnityUnityEngine.Debug,实现自己通过bool值来控制是否进行debug输出。
二、DEBUG 命令使用 1、键入 DEBUG 进入 DEBUG 控制状态,显示提示符 '- '。 2、用命令 F100 10F 'A' 将'A'的ASCII码填入内存。 3、用命令 D100 10F 观察内存中的十六进制码及屏幕右边的ASCII字符。 4、用命令 ...
控制电压大小,开关,这个平台的功能会非常强大
C++ thread退出线程 多线程 子线程控制退出主线程 window VS2017 Debug Error! Abort() has been called. C++ thread退出线程 多线程 子线程控制退出主线程 window VS2017 Debug Error! Abort() has been called.
debug_view_kotlin Debug-View是用Kotlin实现的用于Android调试的浮层调试控制台,这个控制台会一直浮在app的UI最上层, 用于实时地、直观地显示app的性能指标和日志信息:App使用的内存信息、App的实时帧率FPS、app...
iConsole微信使用的控制输出Debug工具包,适用于ios app的调试
封装了Android Log类的功能,便于统一控制日志输出,通过BuildConfig.DEBUG控制日志是否输出,在debug版本自动开启日志,正式版本关闭日志
Android,AMS、WMS、PKMS添加动态控制debug开关功能
* 自定义Log打印类 * 在打印给定字符的同时,还打印出所在语句的方法名、行号、类名,甚至详细调用栈等信息 * 可通过DEBUG控制是否打印 * 可通过POSITION控制是否打印所在语句信息
更新说明: v3.0版本更新 1、增加超级终端模式,可像超级终端一样显示和发送数据 2、超级终端支持'\r'、'\b'特殊字符 3、增加流控制和RTS、DTR信号控制,兼容部分不识别的串口转USB驱动 4、普通模式可鼠标调整发送...
本程序可以自动接收Windows API OutputDebugString输出的调试日志,能够依据不同的进程ID,分类显示,能过滤,还能自动按天保存日志文件,文件的大小可控,文件可在指定个数内回滚,还能自动删除过期的日志文件。...
运用labview编程控制设备充放电柜以及继电器和电流源等操作设备。
蛋糕店 要在本地运行 从 git cli 运行 npm install && bower install 在其默认端口上运行 mongodb,使用此代码将名为 local.env.js 的文件添加到 ... // 使用visionmedia/debug DEBUG 控制模块的调试级别:'' };
简单的示例,欢迎交流学习! C# 读取Excel数据,模拟 STM32 ADC波形采集系统 Chart图表 以Visual Studio 2019为开发环境,结合串口通信串口通信技术开发出一套ADC采集上位机系统。...模拟debug 控制,实现生成图表!
1、使用StackTraceElement输出当前日志所在的当前文件名、行号、函数名; 2、定义了5中日志级别; 3、用BuildConfig.DEBUG控制日志开关,避免不小心将未关闭日志的应用发布到市场上。
Unity debug重构,输出可以控制是否打印Unity debug重构,输出可以控制是否打印Unity debug重构,输出可以控制是否打印
DebugView是一个应用程序,可让您监视调试输出本地系统,或网络上您可以通过其访问的任何计算机 TCP/IP。它能够显示内核模式和Win32调试 输出,因此您不需要调试器来捕获调试输出 生成的应用程序或设备驱动程序,也...
AsmTools软件-debug汇编语言 汇编软件MASM和调试指导 汇编语言是唯一能够充分利用计算机硬件特性并直接控制硬件设备的语言。对于诸如实时控制、软件加密解密、病毒分析、软件调试等领域,汇编语言是最有效的程序设计...