`
cantellow
  • 浏览: 847218 次
  • 性别: 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这一经典的调试工具,包括其在汇编语言程序设计中的重要角色。内容涵盖基础的调试命令,以及如何在实验环境中使用DEBUG进行程序调试,旨在...

    debug命令.txt

    根据提供的文件信息,本文将对“debug命令.txt”中的知识点进行详细解读,主要涉及的是针对“完美世界”这款单机游戏中的调试命令及其用途。这些命令对于深入理解游戏机制、优化游戏体验以及辅助游戏测试等方面具有...

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

    原生的Unity UnityEngine.Debug类提供了丰富的调试工具,如Log、LogError、LogWarning等方法,用于输出信息到控制台。然而,在发布游戏时,这些调试信息通常需要关闭,以减少性能损耗和避免泄露敏感信息。本项目就是...

    qcom高通平台qcat音频分析文档

    本文档主要介绍了qcom高通平台qcat音频分析文档的相关知识点,涵盖了音频分析、音频处理、音频媒体服务、音视频媒体服务、动态debug控制、子系统管理等领域。 一、音频分析 qcat音频分析文档提供了音频分析的相关...

    内核debugfs使用简介

    - `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 Debug 手册中文版 RISC-V 是一个开源的指令集架构(ISA),它提供了一个高度可扩展的架构,可以满足不同的应用需求。RISC-V Debug 手册中文版是 RISC-V 官方提供的一个 Debug 手册,旨在帮助开发者和测试者...

    Spring Boot开启debug模式

    在使用IntelliJ IDEA(IDEA)作为开发环境,基于Spring Boot框架进行开发时,有时候我们需要开启debug模式来调试代码,查找程序中的错误或者优化逻辑。以下将详细介绍如何在mac操作系统下开启Spring Boot的debug模式...

    debug32用于汇编开发

    "DEBUG32.TXT"可能是debug32的使用手册或者帮助文档,包含了工具的功能介绍、操作指南、快捷键列表和常见问题解答。这对于初学者来说是非常宝贵的资源,他们可以从中学习如何有效地利用debug32进行汇编开发。 ...

    Flex Debug-debug版本的安装.exe

    标题中的“Flex Debug-debug版本的安装.exe”指的是Adobe Flex Debugging版本的安装程序。Flex是Adobe公司开发的一个开源框架,用于构建富互联网应用程序(RIA),它基于ActionScript和MXML,通常与Flash Player或...

    riscv-debug-spec-0.11nov12 Riscv 调试文档

    RISC-V Debug Specification为RISC-V处理器提供了统一的调试接口和协议,以便开发者可以为基于RISC-V ISA的硬件实现调试功能。 文档标题“riscv-debug-spec-0.11nov12”指的是RISC-V Debug Specification的版本号为...

    webgl-debug.js

    总之,"webgl-debug.js"是WebGL开发中的一个强大工具,它通过增强错误报告和调试功能,使得原本复杂的WebGL编程变得更加可控和高效。结合"index.html"和"index.js",开发者可以创建出具有强大图形功能且经过充分调试...

    Informatica 运用Debug调试

    **Informatica 运用Debug调试** 在数据集成领域,Informatica是一个强大的ETL(Extract, Transform, Load)工具,用于从各种数据源提取数据、进行转换处理,并加载到目标系统中。在开发和维护复杂的Informatica工作...

    20201221 RISC-V Debug Support Version 1.0.0-STABLE中文版.pdf

    RISC-V Debug Support Version 1.0.0-STABLE 中文版 RISC-V Debug Support Version 1.0.0-STABLE 是一份关于 RISC-V 调试支持的技术规格文档,该文档提供了 RISC-V 调试模块(DM)的详细说明和技术规范。 1. 简介 ...

    debugGUI.zip

    在Unity游戏开发中,Debug GUI(调试图形用户界面)是一个非常重要的工具,它允许开发者在游戏运行时查看和控制各种变量、数据以及功能。当您面对"debugGUI.zip"这个压缩包时,我们可以推测其中包含了用于调试Unity...

    myeclipse的debug调试步骤总结

    MyEclipse Debug 调试步骤总结 MyEclipse Debug 调试是 Java Web 项目开发中非常重要的一步,正确的 Debug 调试可以帮助开发者快速地定位和解决问题。本文将总结 MyEclipse Debug 调试步骤,帮助开发者快速上手使用...

    H3C-DEBUG_基础常识.rar

    "H3C-DEBUG_基础常识.rar"这个压缩包文件显然包含了关于H3C设备调试的基础知识,主要聚焦在DEBUG功能的使用上。DEBUG是网络工程师在排查问题、优化网络性能时常用的一种诊断工具。以下将详细介绍DEBUG的基本概念、...

    命令行debug命令详解

    ### 命令行Debug命令详解 #### 一、概览 `Debug`是一个功能强大的命令行工具,主要用于测试和调试MS-DOS可执行文件。它允许用户在低级环境中控制和修改计算机内存,以及执行各种操作,如汇编、反汇编、内存读写、...

    Unity的debug输出显示在游戏场景中

    本篇文章将深入探讨如何让Unity的Debug输出显示在游戏场景中,这对于实时查看和分析程序状态非常有帮助。 首先,我们需要了解Unity中的Debug.Log()函数。这是Unity内置的一种调试工具,用于在控制台输出文本信息。...

    DebugLog扩展调试demo

    `DebugLog`是一个自定义的日志工具类,它扩展了Android原生的`Log`类,提供了更加丰富的日志输出功能,方便我们在调试应用时获取更详细的信息。本篇文章将深入探讨`DebugLog`的实现原理及其在调试过程中的作用。 `...

Global site tag (gtag.js) - Google Analytics