E81086713E446D36F62B2AA2A3502B5EB155
杂七杂八。。。一家之言
当你要调试一个程序时,如果能把你的Java代码注入到目标程序并运行,这可能会给你的调试开发带来很大的方便,比如打印出一些全局变量值,属性等。本人出于兴趣,封装了一个简单的Java库,可以达到这个目的。这个库主要的API如下
第一个参数: 你要注入的Java程序的PID第二个参数: 你要把那个jar文件(最好用路径全名)注入到目标程序第三个参数: 注入目标程序后运行你指定的那个Class(全名)该库可以从这里下载:http://www.blogjava.net/Files/javacap/VMAttach.zip具体有什么用呢?这个看使用者怎么用,下面我弄个简单的例子。加入一个程序使用一些Singleton对象,并且已经部署并运行了,现在我可能要查看一下这个Singleton对象的一些内部状态。比如,这个程序如下:
现在启动这个Java程序,在命令行窗口运行tasklist查看它的PID,假如为3020。现在加入我要知道这个程序现在的Singleton 对象的stateNum值为多少,该怎么办呢?我们以前一般要以debug模式启动,然后查看变量,难道正常启动就没办法了?当然有,我们可以写个程序,注入到目标进程然后打印出来,不就OK.当然,这里有个问题,注入的java程序是单独在一个线程里跑的,它的Context Class Loader是没有设置的,你要采取一些措施才能找到目标进程已经载入的class,请看下面的代码:
现在,你需要把test.AttachDemo类编译好,单独打包到一个 jar文件,比如d:盘的attachdemo.jar里。上面准备好了,你就差注入attachdemo.jar到目标进程3020了,如下代码就可以完成注入:
运气不错的话,你就能在运行UseSingletonApp程序的命令窗口输出类似:Singleton's stateNum currently is :1630285997总结:目前还不是很完善,只能attach一次,稍后我会完善这个功能。另外就是只支持Window 2000/NT/XP/2003 ,Windows98不支持,Linux/Unix也是还不支持的。
Powered by: BlogJava Copyright © DoubleH