最近遇到一个很有趣的问题。程序在Eclipse开发状态下运行正常,但运行打包好的程序就有错误。然后我突然发现,竟不知道如何脱离Eclipse对一个Java程序做Debug,得找一个Java世界里的GDB。
其实是有的,那就是JPDA(Java Platform Debugger Architecture)–Java平台调试体系结构,IBM developerWorks上面有比较详细的介绍(请搜索“深入Java调试体系”),大概的结构也分几层,有Debuggee(被调试者),Debugger(调试者)等角色。
那如何进行调试呢?
还是举个小例子。有如下程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class Debuggee { public static void main(String[] args) throws InterruptedException { int i = 0; while (true) { System.out.println("Hello World! " + (i++)); Thread.sleep(1000); } } } |
这是一死循环,不停的在打“Hello,World!”。
打包成一个test.jar, 然后用如下命令行启动。
1 |
java -Xrunjdwp:transport=dt_socket,address=9002,server=y,suspend=n -jar test.jar |
好吧,你看到了一些JVM的参数。是的,加上-Xrunjdwp,JVM在启动test.jar时,会启动一个调试的Agent。后面具体参数的意思是:
启动之后,你会看到,
1 |
Listening for transport dt_socket at address: 9002 |
这是说Debuggee已经在准备Debugger的到来了。
Debugger连接
Debugger是谁?Eclipse是个不错的选择。如何建立连接?很容易,Let’s step by step.
- 选择Run->Debug Configurations…
- 选中“Remote Java Application”右击选择New。
- 然后填写Name,Host,Port,ConnectionType选择“Standard (Socket Attach)”。
- 点击“Debug”后,你会发现到不到源码,程序的执行也暂停了。
- 如果有源码的话,点击加载源码。
- 然后就可以加断点Debug了。
好了,这就完成了Java的程序的远程调试。当然没有源码也是可以调的,只是不那么直观。总之,很酷! 😛