使用JDI进行线上程序断点信息记录

之前在某一次蚂蚁金服的分享当中,得知可以通过在线上程序中进行断点记录,当程序运行到断点的时候,即将此次调用的上下文信息记录下来,以进行进一次分析。实际上这也是相当于在程序中打log记录信息的方式了。当线上出现问题时,我们最希望的就是将相应的参数信息记录下来,以拿到当时的数据,以便知道到底是哪儿出现了问题。但又不希望通过重新在代码中加入代码,然后发布这样的方式,因为新的发布可能导致问题重现机率变小等。

java的整个调试体系为JDPA,Oracle提供了高级的jdi接口以方便使用java来连接调试程序进行相应的调试。这样,只需要调用相应的java接口,就能进行打断点,记录断点,然后继续运行,清除断点这样基本的断点调试手法了。

1. 连接远程JVM

连接其它JVM称之为附加(attach)操作,当前实现中有2种,如果是本地JVM,则通过Process的方式即可,如果是远程,则需要通过socket的方式才能进行连接。首先是server端需要开启调试agent,并且指定相应的端口,如下启动命令所示:

-Xdebug -agentlib:jdwp=transport=dt_socket,address=1234,server=y,suspend=n

上面的参数表示监听指定端口(1234),并且当存在断点时并不主动阻塞。
旧的JVM也有使用Xrunjdwp参数的,但不再被建议使用.

继续阅读“使用JDI进行线上程序断点信息记录”

增强jpda以进行java程序的调试开发(转自taobao开发博客)

     在平常的开发过程中,我们经常需要在项目已经运行的情况下,修改java代码,并在不重新启动web容器(如tomcat)的情况下,进行hotswap调试开发。这是由java的jpda功能来提供的。然而,默认的jpda只允许方法内部实现的修改,对于增加方法,删除方法等操作,是不支持的,这种情况下必须重新启动web容器再进行调试开发。而通过修改jvm,来增加java的调试,就可以达到默认的jvm所不能达到的效果。dcevm就是这么一个组件,它通过替换jvm来实现增加的jpda。
    本文转自taobao中间件开发博客,原文地址为:hotswap 用户手册.

继续阅读“增强jpda以进行java程序的调试开发(转自taobao开发博客)”