E81086713E446D36F62B2AA2A3502B5EB155
雜七雜八。。。一家之言
#
當你要調(diào)試一個程序時,如果能把你的Java代碼注入到目標程序并運行,這可能會給你的調(diào)試開發(fā)帶來很大的方便,比如打印出一些全局變量值,屬性等。本人出于興趣,封裝了一個簡單的Java庫,可以達到這個目的。這個庫主要的API如下
第一個參數(shù): 你要注入的Java程序的PID第二個參數(shù): 你要把那個jar文件(最好用路徑全名)注入到目標程序第三個參數(shù): 注入目標程序后運行你指定的那個Class(全名)該庫可以從這里下載:http://www.tkk7.com/Files/javacap/VMAttach.zip具體有什么用呢?這個看使用者怎么用,下面我弄個簡單的例子。加入一個程序使用一些Singleton對象,并且已經(jīng)部署并運行了,現(xiàn)在我可能要查看一下這個Singleton對象的一些內(nèi)部狀態(tài)。比如,這個程序如下:
現(xiàn)在啟動這個Java程序,在命令行窗口運行tasklist查看它的PID,假如為3020。現(xiàn)在加入我要知道這個程序現(xiàn)在的Singleton 對象的stateNum值為多少,該怎么辦呢?我們以前一般要以debug模式啟動,然后查看變量,難道正常啟動就沒辦法了?當然有,我們可以寫個程序,注入到目標進程然后打印出來,不就OK.當然,這里有個問題,注入的java程序是單獨在一個線程里跑的,它的Context Class Loader是沒有設置的,你要采取一些措施才能找到目標進程已經(jīng)載入的class,請看下面的代碼:
現(xiàn)在,你需要把test.AttachDemo類編譯好,單獨打包到一個 jar文件,比如d:盤的attachdemo.jar里。上面準備好了,你就差注入attachdemo.jar到目標進程3020了,如下代碼就可以完成注入:
運氣不錯的話,你就能在運行UseSingletonApp程序的命令窗口輸出類似:Singleton's stateNum currently is :1630285997總結(jié):目前還不是很完善,只能attach一次,稍后我會完善這個功能。另外就是只支持Window 2000/NT/XP/2003 ,Windows98不支持,Linux/Unix也是還不支持的。
Powered by: BlogJava Copyright © DoubleH