<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    E81086713E446D36F62B2AA2A3502B5EB155

    Java雜家

    雜七雜八。。。一家之言

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      40 Posts :: 1 Stories :: 174 Comments :: 0 Trackbacks

    當你要調(diào)試一個程序時,如果能把你的Java代碼注入到目標程序并運行,這可能會給你的調(diào)試開發(fā)帶來很大的方便,比如打印出一些全局變量值,屬性等。
    本人出于興趣,封裝了一個簡單的Java庫,可以達到這個目的。

    這個庫主要的API如下

    1 public ? class ?com.yovn.labs.vmattach.VMTool
    2 {
    3 ????? public ? static ? void ?attachJarToVM(String?pid,String?jarPath,String?mainClassToRun) throws ???AttachException
    4
    5 }

    第一個參數(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)。

    比如,這個程序如下:

    ?1 package ?test;?
    ?2
    ?3 import ?java.util.Random;?
    ?4
    ?5 /**
    ?6 ?*? @author ?yovn
    ?7 ?*
    ?8 ? */

    ?9 public ? class ?UseSingletonApp? {?
    10
    11 ? /**
    12 ??*? @param ?args
    13 ?? */

    14 ? public ? static ? void ?main(String[]?args)? {
    15 ??
    16 ?? new ?Thread(Singleton.getInstance()).start();
    17 ???
    18
    19 ?}

    20 ? public ? static ? class ?Singleton? implements ?Runnable
    21 ? {
    22 ?? private ? final ? static ?Singleton?instance = new ?Singleton();
    23 ?? private ? volatile ? int ?stateNum;
    24 ??
    25 ??
    26 ?? private ?Singleton()
    27 ?? {
    28 ???
    29 ??}

    30 ?? public ? static ?Singleton?getInstance()
    31 ?? {
    32 ??? return ?instance;
    33 ??}

    34 ?? public ? void ?run()? {
    35 ??? while ( true )
    36 ??? {
    37 ????stateNum = new ?Random().nextInt();
    38 ???? try ? {
    39 ?????Thread.sleep( 1000 );
    40 ????}
    ? catch ?(InterruptedException?e)? {
    41 ????? // ?TODO?Auto-generated?catch?block
    42 ?????e.printStackTrace();
    43 ????}

    44 ???}

    45 ???
    46 ??}

    47 ??
    48 ?}
    ?
    49
    50 }

    51
    52


    現(xiàn)在啟動這個Java程序,在命令行窗口運行tasklist查看它的PID,假如為3020。
    現(xiàn)在加入我要知道這個程序現(xiàn)在的Singleton 對象的stateNum值為多少,該怎么辦呢?
    我們以前一般要以debug模式啟動,然后查看變量,難道正常啟動就沒辦法了?
    當然有,我們可以寫個程序,注入到目標進程然后打印出來,不就OK.

    當然,這里有個問題,注入的java程序是單獨在一個線程里跑的,它的Context Class Loader是沒有設(shè)置的,你要采取一些措施才能找到目標進程已經(jīng)載入的class,請看下面的代碼:

    ?1?package?test;?
    ?2?
    ?3?import?java.lang.reflect.Field;
    ?4?import?java.lang.reflect.Method;?
    ?5?
    ?6?/**
    ?7??*?@author?yovn
    ?8??*
    ?9??*/
    10?public?class?AttachDemo?{?
    11?
    12??/**
    13???*?@param?args
    14???*/
    15??public?static?void?main(String[]?args)?{
    16???try?{
    17????Class?cls=null;//the?class?we?try?to?load?that?alrady?loaded?by?target?process
    18????
    19????//following?code?iterate?the?thread?tree,to?use?every?one?context?class?loader?to?load?the?class?util?success
    20????ThreadGroup?group?=?Thread.currentThread().getThreadGroup();
    21????while?(group?!=?null)?{
    22?????int?tc?=?group.activeCount();
    23?????Thread[]?ts?=?new?Thread[tc];
    24?????group.enumerate(ts);
    25?????for?(int?i?=?0;?i?<?tc;?i++)?{
    26??????if?(ts[i]?!=?null)?{
    27???????try{
    28????????cls=ts[i].getContextClassLoader().loadClass("test.UseSingletonApp$Singleton");
    29???????Thread.currentThread().setContextClassLoader(ts[i].getContextClassLoader());
    30???????break;
    31???????}catch(Exception?e){}
    32???????
    33??????}
    34?????}
    35?????group?=?group.getParent();
    36????}
    37????if(cls==null)
    38????{
    39?????System.out.println("can?not?load?class");
    40?????return;
    41????}
    42????Field?f?=?cls.getDeclaredField("stateNum");
    43????f.setAccessible(true);
    44????Method?getInM?=?cls.getMethod("getInstance",?new?Class[]?{});
    45????Object?singleton?=?getInM.invoke(null,?new?Object[]?{});//get?the?singleton?object
    46????
    47????int?stateNum?=?((Integer)?f.get(singleton)).intValue();
    48????System.out.println("Singleton's?stateNum?currently?is?:"?+?stateNum);
    49???}?catch?(Exception?e)?{
    50????e.printStackTrace();
    51???}?
    52?
    53??}?
    54?
    55?}
    56?
    57?


    現(xiàn)在,你需要把test.AttachDemo類編譯好,單獨打包到一個 jar文件,比如d:盤的attachdemo.jar里。
    上面準備好了,你就差注入attachdemo.jar到目標進程3020了,
    如下代碼就可以完成注入:

    ?1?import?com.yovn.labs.vmattach.AttachException;
    ?2?import?com.yovn.labs.vmattach.VMTool;?
    ?3?
    ?4?public?class?Test?{
    ?5?/**
    ?6???*?@param?args
    ?7???*?@throws?AttachException?
    ?8???*/
    ?9??public?static?void?main(String[]?args)?throws?AttachException?{
    10???VMTool.attachJarToVM("3020",?"D:\\attachdemo.jar",?"test.AttachDemo");
    11??}?
    12?
    13?}
    14?
    15?



    運氣不錯的話,你就能在運行UseSingletonApp程序的命令窗口輸出類似:
    Singleton's stateNum currently is :1630285997



    總結(jié):
    目前還不是很完善,只能attach一次,稍后我會完善這個功能。另外就是只支持Window 2000/NT/XP/2003 ,Windows98不支持,Linux/Unix也是還不支持的。

    posted on 2007-01-04 13:52 DoubleH 閱讀(6166) 評論(4)  編輯  收藏

    Feedback

    # re: 運行時注入你的Java代碼到一個已經(jīng)在運行的Java程序 2007-01-04 14:18 BeanSoft
    是用的 JDK 1.6 才能支持吧? 呵, 無源碼.. JVMTI 之類的  回復(fù)  更多評論
      

    # re: 運行時注入你的Java代碼到一個已經(jīng)在運行的Java程序 2007-01-04 14:23 Javacap
    @BeanSoft
    不是,JDK6里的Attach API估計不是這樣實現(xiàn)的。它可能在新的JVM里開了什么服務(wù)程序,但是支持多平臺,我這個目前只能是 Windows, 但是對JDK沒什么要求,只要JDK1.2以上就可以了。  回復(fù)  更多評論
      

    # re: 運行時注入你的Java代碼到一個已經(jīng)在運行的Java程序 2007-01-05 11:17 iNeo
    不錯.對于一個WEB服務(wù)來說,如果能在某個業(yè)務(wù)邏輯運行時截獲該程序,并讀取該程序的相關(guān)參數(shù)的話,用來排錯很有用.  回復(fù)  更多評論
      

    # re: 運行時注入你的Java代碼到一個已經(jīng)在運行的Java程序 2015-04-07 14:53 ww
    wroker.dll 和 vmattach.dll有源碼嗎?求分享  回復(fù)  更多評論
      


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 一级毛片免费不卡在线| 免费a级毛片无码a∨免费软件 | 免费人成在线观看视频播放| 久久精品国产亚洲AV电影网| 国产亚洲av片在线观看18女人| 亚洲免费视频网站| 亚洲精品成a人在线观看☆ | 亚洲精品中文字幕| 亚洲午夜久久久久久久久电影网| 亚洲啪啪免费视频| 免费国产在线精品一区| 亚洲激情视频在线观看| 日韩一级视频免费观看| 在线看片免费人成视频播| 亚洲欧好州第一的日产suv| 国产亚洲人成无码网在线观看| 卡一卡二卡三在线入口免费| 成人国产精品免费视频| 中文字幕亚洲情99在线| 亚洲午夜未满十八勿入网站2| 无码高潮少妇毛多水多水免费| 成av免费大片黄在线观看| 亚洲熟妇无码一区二区三区| 久久亚洲国产视频| 免费成人在线观看| 久久久高清免费视频| 国产精品偷伦视频观看免费 | 一级免费黄色毛片| 亚洲精品第一综合99久久| 亚洲AV综合色区无码另类小说| 国产精品视频免费一区二区三区| 最近中文字幕mv免费高清在线| 国产JIZZ中国JIZZ免费看| 亚洲精品无码久久久久YW| 亚洲色图综合网站| 亚洲日韩精品一区二区三区无码 | 在线播放免费人成视频网站| 中文字幕亚洲情99在线| 亚洲无线一二三四区| 亚洲va无码专区国产乱码| 亚洲综合精品网站在线观看|