`
cantellow
  • 浏览: 842558 次
  • 性别: Icon_minigender_1
  • 来自: 草帽海贼团
社区版块
存档分类
最新评论

Debug控

    博客分类:
  • Java
 
阅读更多

 

我是一个debug控,很少写单元测试(不是我不想写),每次写完代码我都要把我的代码debug走一遍,这样才放心,debug也是我阅读别人代码的利器,同时我也经常用它来调试错误。 

 

因为上家公司是做CS程序的,本地debug很方便, serverclient启动也不是很慢,所以用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即可。

 

注意:由于javadebug框架能够看到所有线程的状态(eclipse 3.6debug还提供了阻塞整个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”JPDAJava 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/classesclasspath等,所以必须把修改之后的class文件放在对应的目录下,jrebel才检测得到进而采取热加载,而不像debug模式那样,直接替换内存中的方法body。另外,刚开始修改了方法body,更新WEB-INF/classes下面的class文件,jrebel重新检测到并装载,但是第二次新建了一个public的字段和一个方法,就不行了,不知道是我配置不对,还是它确实不像传言中能够实现新增java类和方法也能即时生效。

 

最后,不知道有人用过jetty吗?配合JEE版本的eclipse不知道能不能实现新增java类和方法也无需重启应用服务器即可生效的功能??

  • 大小: 7 KB
  • 大小: 4.6 KB
  • 大小: 8.5 KB
5
3
分享到:
评论
5 楼 fei33423 2012-12-17  
HotSwap”是JPDA ,热修改这点,查了好多东东; 终于知道了这个术语;
不过研究了jvmTI jdi东东;
可以专门搞个标题;
4 楼 rmn190 2011-08-03  
  标题吸引了我, 说真的, 我曾经也是个debug控(当时没想到用这个词来表达), 被我debug的框架有N多, 如hibernate、Spring、Struts、Tomcat、Ant、HyperSQL、JUnit.... 

  现在回头再看时, 有些苦笑。

  应该说debug代表了满腔热情, 不过, 漂亮地完成一件事只有热情还是不够的。

  单元测试和Log分析是这方面的很好,很专业的选择。
3 楼 cantellow 2011-08-03  
snake1987 写道
~~~debug始终不是正途啊~

单元测试?不过可能你误会了,单元测试和debug没有冲突的,我只是在刚写完代码debug,调试错误才debug,而单元测试是根本,侧重点不一样的。
2 楼 yutian2211 2011-08-03  
个人觉得首先看log才是王道
1 楼 snake1987 2011-08-03  
~~~debug始终不是正途啊~

相关推荐

    DEBUG的常用命令(很全面,很详细)

    debug的一些常用命令,很详细.包含很多基础的实验(本人觉得光是里面附录离得内容就值得下载了)

    debug命令.txt

    完美世界单机 debug命令 喜欢玩完美的可以来看看啊

    Unity3D重新封装Debug实现自主控制是否开启Debug输出

    重新封装原生UnityUnityEngine.Debug,实现自己通过bool值来控制是否进行debug输出。

    汇编语言DEBUG

    二、DEBUG 命令使用  1、键入 DEBUG 进入 DEBUG 控制状态,显示提示符 '- '。  2、用命令 F100 10F 'A' 将'A'的ASCII码填入内存。  3、用命令 D100 10F 观察内存中的十六进制码及屏幕右边的ASCII字符。 4、用命令 ...

    Debug_控制平台_USB电路控制_

    控制电压大小,开关,这个平台的功能会非常强大

    C++ thread退出线程 多线程 子线程控制退出主线程 window VS2017 Debug Error! Abort() has been called

    C++ thread退出线程 多线程 子线程控制退出主线程 window VS2017 Debug Error! Abort() has been called. C++ thread退出线程 多线程 子线程控制退出主线程 window VS2017 Debug Error! Abort() has been called.

    Android代码-debug_view_kotlin

    debug_view_kotlin Debug-View是用Kotlin实现的用于Android调试的浮层调试控制台,这个控制台会一直浮在app的UI最上层, 用于实时地、直观地显示app的性能指标和日志信息:App使用的内存信息、App的实时帧率FPS、app...

    iConsole微信使用的控制输出Debug工具包

    iConsole微信使用的控制输出Debug工具包,适用于ios app的调试

    统一日志工具类

    封装了Android Log类的功能,便于统一控制日志输出,通过BuildConfig.DEBUG控制日志是否输出,在debug版本自动开启日志,正式版本关闭日志

    Android,AMS、WMS、PKMS添加动态控制debug开关功能

    Android,AMS、WMS、PKMS添加动态控制debug开关功能

    自定义Android Log打印类

    * 自定义Log打印类 * 在打印给定字符的同时,还打印出所在语句的方法名、行号、类名,甚至详细调用栈等信息 * 可通过DEBUG控制是否打印 * 可通过POSITION控制是否打印所在语句信息

    SerialDebug V3.0

    更新说明: v3.0版本更新 1、增加超级终端模式,可像超级终端一样显示和发送数据 2、超级终端支持'\r'、'\b'特殊字符 3、增加流控制和RTS、DTR信号控制,兼容部分不识别的串口转USB驱动 4、普通模式可鼠标调整发送...

    调试日志大师(DebugView的增强版)

    本程序可以自动接收Windows API OutputDebugString输出的调试日志,能够依据不同的进程ID,分类显示,能过滤,还能自动按天保存日志文件,文件的大小可控,文件可在指定个数内回滚,还能自动删除过期的日志文件。...

    BMS Debug Toolxingyun_labview_

    运用labview编程控制设备充放电柜以及继电器和电流源等操作设备。

    cupcakeStore

    蛋糕店 要在本地运行 从 git cli 运行 npm install && bower install 在其默认端口上运行 mongodb,使用此代码将名为 local.env.js 的文件添加到 ... // 使用visionmedia/debug DEBUG 控制模块的调试级别:'' };

    C# STM32 ADC波形采集系统 Chart图表

    简单的示例,欢迎交流学习! C# 读取Excel数据,模拟 STM32 ADC波形采集系统 Chart图表 以Visual Studio 2019为开发环境,结合串口通信串口通信技术开发出一套ADC采集上位机系统。...模拟debug 控制,实现生成图表!

    android自定义日志类Log

    1、使用StackTraceElement输出当前日志所在的当前文件名、行号、函数名; 2、定义了5中日志级别; 3、用BuildConfig.DEBUG控制日志开关,避免不小心将未关闭日志的应用发布到市场上。

    Unity debug重构

    Unity debug重构,输出可以控制是否打印Unity debug重构,输出可以控制是否打印Unity debug重构,输出可以控制是否打印

    Dbgview DebugView v4.90 微软调试视图

    DebugView是一个应用程序,可让您监视调试输出本地系统,或网络上您可以通过其访问的任何计算机 TCP/IP。它能够显示内核模式和Win32调试 输出,因此您不需要调试器来捕获调试输出 生成的应用程序或设备驱动程序,也...

    AsmTools-debug汇编语言+汇编软件MASM和调试.zip

    AsmTools软件-debug汇编语言 汇编软件MASM和调试指导 汇编语言是唯一能够充分利用计算机硬件特性并直接控制硬件设备的语言。对于诸如实时控制、软件加密解密、病毒分析、软件调试等领域,汇编语言是最有效的程序设计...

Global site tag (gtag.js) - Google Analytics