临时要调试一个Java程序,于是乎顺便学习一下Java的调试器JDB。配置上的东西不怎么难,但需要一点时间熟悉Java的工具链。所以在这里做个记录。

调试一个程序通常要两步准备,一是往程序中添加调试信息,二是把运行程序时让调试器介入。

如何往Java程序中加入调试信息

如果是直接使用Javac编译程序,那么在命令行加上以下选项:

参考javac的文档。

如果是ant的工程,则在调试对象的target中指定:

具体可以参考ant关于javac的文档中debuglevel一栏

如何让JDB介入调试对象

JDB调试有本地和远程两种模式。本地模式只须直接调用被调试程序即可,例如:

本地调试有时候不方便,比如调试对象在远程服务器上,这时候远程模式就派上用场了。首先,运行Java虚拟机的时候使调试程序处于等待状态。可以指定Java的命令行选项来达到这个效果:

如果使用ant,可以在Target里面指定相应的属性:

完成上述步骤,调试对象会进入等待jdb连接状态,这时启动JDB连上就可以开始调试了:

更多JDB使用可以参考这篇文章

**

小瑕疵(Caveats)**

  • 有时候JDB无法显示源文件内容,需要在命令行选项-sourcepath指定源代码路径。
  • 默认情况下JDB遇到一个Exception就会停下来,执行ignore uncaught java.lang.Throwable可以避免此现象
  • JDB的命令行编辑功能较弱,不能保存历史,听说JLine可以解决这个问题,stackoverflow上有个相应的问题介绍
  • JDB启动的时候可以调用一些初始的命令,可以放在home目录下的jdb.ini或者.jdbrc