使用JPDA进行Java程序的Debug

最近遇到一个很有趣的问题。程序在Eclipse开发状态下运行正常,但运行打包好的程序就有错误。然后我突然发现,竟不知道如何脱离Eclipse对一个Java程序做Debug,得找一个Java世界里的GDB。

其实是有的,那就是JPDA(Java Platform Debugger Architecture)–Java平台调试体系结构,IBM developerWorks上面有比较详细的介绍(请搜索“深入Java调试体系”),大概的结构也分几层,有Debuggee(被调试者),Debugger(调试者)等角色。

那如何进行调试呢?

还是举个小例子。有如下程序:

这是一死循环,不停的在打“Hello,World!”。

打包成一个test.jar, 然后用如下命令行启动。

好吧,你看到了一些JVM的参数。是的,加上-Xrunjdwp,JVM在启动test.jar时,会启动一个调试的Agent。后面具体参数的意思是:

启动之后,你会看到,

这是说Debuggee已经在准备Debugger的到来了。

Debugger连接

Debugger是谁?Eclipse是个不错的选择。如何建立连接?很容易,Let’s step by step.

  1. 选择Run->Debug Configurations…
  2. 选中“Remote Java Application”右击选择New。
  3. 然后填写Name,Host,Port,ConnectionType选择“Standard (Socket Attach)”。
  4. 点击“Debug”后,你会发现到不到源码,程序的执行也暂停了。
  5. 如果有源码的话,点击加载源码。
  6. 然后就可以加断点Debug了。

好了,这就完成了Java的程序的远程调试。当然没有源码也是可以调的,只是不那么直观。总之,很酷! 😛

关于如何用C++实现一个不可以被继承的类

很早以前在某个笔试题集里看到了这个题目,MS是Adobe公司出的。当时第一反应要用到什么私用化构造函数,友元之类的技术,但后来实现的时候却发现更多的问题,现在已经一一搞明白了。今天记在这,总结一下。

主要的代码:

几个要点:

  1. 在NoDeriveBase这个类里是不能直接写,friend class T的,编译器(gcc)会报错。所以要用Type2Type的技术,Loki库里常用的技术。
  2. 为什么A要虚继承自NoDeriveBase?原因是A虚继承后,B再继承A时,B要直接访问虚基类的构造函数,而不是直接通过A的构造再访问NoDeriveBase的构造。所以,如果不虚继承的话,B是可以继承A的。
  3. 这段代码会编译出错。B是不可以继承A的。

终于都明白了! 🙂