😎
没事写写博客,没事拍拍照片。。。
最近遇到一个很有趣的问题。程序在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是谁?Eclipse是个不错的选择。如何建立连接?很容易,Let’s step by step.
好了,这就完成了Java的程序的远程调试。当然没有源码也是可以调的,只是不那么直观。总之,很酷! 😛
很早以前在某个笔试题集里看到了这个题目,MS是Adobe公司出的。当时第一反应要用到什么私用化构造函数,友元之类的技术,但后来实现的时候却发现更多的问题,现在已经一一搞明白了。今天记在这,总结一下。
主要的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include <iostream> using namespace std; template<typename T> struct Type2Type { typedef T Value; }; template<typename T> class NoDerivedBase { friend class Type2Type<T>::Value; private: NoDerivedBase() {} ~NoDerivedBase() {} }; class A : virtual public NoDerivedBase<A> { public: A() { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; } }; class B : public A { public: B() { cout << "B()" << endl; } ~B() { cout << "~B()" << endl; } }; int main() { A a; B b; } |
几个要点:
终于都明白了! 🙂