JAVA總結(jié)學(xué)習(xí)筆記

          學(xué)問(wèn)大,知識(shí)多

          基于遠(yuǎn)程怎么調(diào)試JAVA呢?

          基于遠(yuǎn)程怎么調(diào)試JAVA呢?
          JAVA的長(zhǎng)途調(diào)試 基于Java Platform Debugger Architecture(JPDA:Java平臺(tái)調(diào)試架構(gòu))。 JVM 自身支撐指定參數(shù)來(lái)讓java順序以調(diào)試形式啟動(dòng)。虛擬機(jī)運(yùn)轉(zhuǎn)在調(diào)試形式下,你只需去銜接他的響應(yīng)的監(jiān)聽(tīng)端口就可以了。

          像tomcat等效勞器也都供應(yīng)了指定調(diào)試參數(shù)的設(shè)置辦法

          典型的調(diào)試參數(shù)如下
          -Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=n

          典型的銜接 調(diào)試端口的敕令如下,以jdk自帶的敕令行調(diào)試 東西jdb為例。

          銜接 192.29.24.62 的8888 端口
          /build/java/jdk1.6.0_03/bin/jdb -attach 192.29.24.62:8888    

          下面這句和上面采用attach參數(shù)的上面一句一樣的結(jié)果。但是采用 -connect的指定了具體了,有時(shí)從windows的機(jī)械上去銜接上面
          Linux的機(jī)械,上面阿誰(shuí)不可,但是這句就可以。
          /build/java/jdk1.6.0_03/bin/jdb -connect   com.sun.jdi.SocketAttach:port=8888,hostname=192.29.24.62

          在 Eclipse 中也有長(zhǎng)途調(diào)試 選項(xiàng)的了,“run” -》 “Open Debug Dialog” -》“Remote Java Application” 阿誰(shuí)就是。
          在選項(xiàng)里面選定詳細(xì)的“項(xiàng)目” “代碼目次”等,填好ip、端口,最終點(diǎn)下面的“ 調(diào)試 ”按鈕就行了,啟動(dòng)后下斷點(diǎn),等等都和本機(jī)調(diào)試無(wú)異。留意的是本機(jī)的代碼和在長(zhǎng)途機(jī)上運(yùn)轉(zhuǎn)的代碼應(yīng)該是一致的

          <img style=\"WIDTH: 580px; HEIGHT: 464px\" class=\"blogimg\" border=\"0\" src=\"http://hiphotos.baidu.com/widebright/pic/item/e122e9c4eb5214a68226ac06.jpg\" width=\"580\" height=\"464\" small=\"0\" />

          ----------------jdb 用法----------------
          C:\\Program Files\\Java\\jdk1.6.0_03\\bin>jdb -help
          用法:jdb <選項(xiàng)> <類> <參數(shù)>

          個(gè)中選項(xiàng)包羅:
              -help             輸出此音訊并退出
              -sourcepath <以 \";\" 分隔的目次>
                                在個(gè)中查找源文件的目次
              -attach <地址>
                                運(yùn)用規(guī)范銜接器銜接到正在指定地址運(yùn)轉(zhuǎn)的 VM
              -listen <地址>
                                等候正在指定地址運(yùn)轉(zhuǎn)的 VM 運(yùn)用規(guī)范銜接器進(jìn)行銜接
              -listenany
                                等候正在恣意可用地址運(yùn)轉(zhuǎn)的 VM 運(yùn)用規(guī)范銜接器進(jìn)行銜接
              -launch
                                立刻啟動(dòng) VM,而不等候 \'run\' 敕令
              -listconnectors   列出此 VM 中可用的銜接器
              -connect <銜接器稱號(hào)>:<稱號(hào) 1>=<值 1>,...
                                運(yùn)用定名的銜接器和列出的參數(shù)值銜接到目的 VM
              -dbgtrace [標(biāo)記](méi) 輸出用于調(diào)試 jdb 的信息
              -tclient          在 Hotspot(TM) Performance Engine(客戶機(jī))中運(yùn)轉(zhuǎn)使用順序
              -tserver          在 Hotspot(TM) Performance Engine(效勞器)中運(yùn)轉(zhuǎn)使用順序

          轉(zhuǎn)發(fā)給被調(diào)試歷程的選項(xiàng):
              -v -verbose[:class|gc|jni]
                                啟用具體形式
              -D<稱號(hào)>=<值> 設(shè)置系統(tǒng)屬性
              -classpath <以 \";\" 分隔的目次>
                                列出要在個(gè)中查找類的目次
              -X<選項(xiàng)>        非規(guī)范目的 VM 選項(xiàng)

          <類> 是要開(kāi)端調(diào)試的類的稱號(hào)
          <參數(shù)> 是傳遞給 <類> 的 main() 辦法的參數(shù)

          要取得敕令協(xié)助,請(qǐng)?jiān)?jdb 提醒符下鍵入 \'help\'

          C:\\Program Files\\Java\\jdk1.6.0_03\\bin>jdb
          正在初始化 jdb...
          > help
          ** 敕令列表 **
          connectors                -- 列出此 VM 中可用的銜接

          run [類 [參數(shù)]]        -- 開(kāi)端執(zhí)行使用順序的主類

          threads [線程組]     -- 列出線程
          thread <線程 ID>        -- 設(shè)置默許線程
          suspend [線程 ID]    -- 暫停線程(默許值為 all)
          resume [線程 ID]     -- 恢復(fù)線程(默許值為 all)
          where [<線程 ID> | all] -- 轉(zhuǎn)儲(chǔ)線程的倉(cāng)庫(kù)
          wherei [<線程 ID> | all] -- 轉(zhuǎn)儲(chǔ)線程的倉(cāng)庫(kù)以及 pc
          up [n 幀]             -- 向上挪動(dòng)線程的倉(cāng)庫(kù)
          down [n 幀]           -- 向下挪動(dòng)線程的倉(cāng)庫(kù)
          kill <線程 ID> <表達(dá)式>   -- 中止具有給定的異常對(duì)象
          interrupt <線程 ID>     -- 中綴線程

          print <表達(dá)式>              -- 輸出表達(dá)式的值
          dump <表達(dá)式>               -- 輸出一切對(duì)象信息
          eval <表達(dá)式>               -- 核算表達(dá)式的值(與
          set = <表達(dá)式>     -- 為字段/變量/數(shù)組元素
          locals                    -- 輸出當(dāng)時(shí)倉(cāng)庫(kù)幀中的一切

          classes                   -- 列出當(dāng)時(shí)已知的類
          class <類 ID>          -- 顯示已定名類的具體信息
          methods <類 ID>        -- 列出類的辦法
          fields <類 ID>         -- 列出類的字段

          threadgroups              -- 列出線程組
          threadgroup <稱號(hào)>        -- 設(shè)置當(dāng)時(shí)線程組

          stop in <類 ID>.<辦法>[(參數(shù)類型,...)]
                                    -- 在辦法中設(shè)置斷點(diǎn)
          stop at <類 ID>:<行> -- 在行中設(shè)置斷點(diǎn)
          clear <類 ID>.<辦法>[(參數(shù)類型,...)]
                                    -- 肅清辦法中的斷點(diǎn)
          clear <類 ID>:<行>   -- 肅清行中的斷點(diǎn)
          clear                     -- 列出斷點(diǎn)
          catch [uncaught|caught|all] <類 ID>|<類形式>
                                    -- 呈現(xiàn)指定的異常時(shí)中綴
          ignore [uncaught|caught|all] <類 ID>|<類形式>
                                    -- 關(guān)于指定的異常,作廢
          watch [access|all] <類 ID>.<字段名>
                                    -- 看管對(duì)字段的拜訪/修正
          unwatch [access|all] <類 ID>.<字段名>
                                    -- 中止看管對(duì)字段的拜訪/
          trace [go] methods [thread]
                                    -- 跟蹤辦法的進(jìn)入和退出。
                                    -- 除非指定 \'go\',不然所
          trace [go] method exit | exits [thread]
                                    -- 跟蹤當(dāng)時(shí)辦法的退出或所
                                    -- 除非指定 \'go\',不然所
          untrace [辦法]         -- 中止跟蹤辦法的進(jìn)入和/或退
          step                      -- 執(zhí)行當(dāng)時(shí)行
          step up                   -- 執(zhí)行到當(dāng)時(shí)辦法返回其調(diào)
          stepi                     -- 執(zhí)行當(dāng)時(shí)指令
          next                      -- 跳過(guò)一行(跨過(guò)挪用)
          cont                      -- 從斷點(diǎn)處持續(xù)執(zhí)行

          list [line number|method] -- 輸出源代碼
          use(或 sourcepath)[源文件途徑]
                                    -- 顯示或更改源途徑
          exclude [<類形式>, ...|“無(wú)”]
                                    -- 不申報(bào)指定類的步調(diào)或方
          classpath                 -- 從目的 VM 輸出類途徑信

          monitor <敕令>         -- 每次順序中止時(shí)執(zhí)行敕令
          monitor                   -- 列出看管器
          unmonitor <看管器號(hào)>      -- 刪除某個(gè)看管器
          read <文件名>           -- 讀取并執(zhí)行某個(gè)敕令文件

          lock <表達(dá)式>               -- 輸出對(duì)象的鎖信息
          threadlocks [線程 ID]   -- 輸出線程的鎖信息

          pop                       -- 彈出整個(gè)倉(cāng)庫(kù),且包括當(dāng)
          reenter                   -- 與 pop 效果一樣,但重
          redefine <類 ID> <類文件名>
                                    -- 從新界說(shuō)類代碼

          disablegc <表達(dá)式>          -- 制止對(duì)象的渣滓收受接管
          enablegc <表達(dá)式>           -- 答應(yīng)對(duì)象的渣滓收受接管

          !!                        -- 反復(fù)執(zhí)行最終一個(gè)敕令
          <敕令>             -- 將敕令反復(fù)執(zhí)行 n 次
          # <敕令>               -- 拋棄(不執(zhí)行)
          help(或 ?)               -- 列出敕令
          version                   -- 輸出書本信息
          exit(或 quit)            -- 退出調(diào)試器

          <類 ID>: 帶有軟件包限制符的完好類名
          <類形式>: 帶有前導(dǎo)或后綴通配符 (*) 的類名
          <線程 ID>: \'threads\' 敕令中所申報(bào)的線程號(hào)
          <表達(dá)式>: Java(TM) 編程言語(yǔ)表達(dá)式。
          支撐大大都經(jīng)常見(jiàn)語(yǔ)法。

          可以將啟動(dòng)敕令置于 \"jdb.ini\" 或 \".jdbrc\" 之中
          (兩者位于 user.home 或 user.dir 中)
          >

          ==========參考文檔=======================================


          什么是JPDA
            Java Platform Debugger Architecture(JPDA:Java平臺(tái)調(diào)試架構(gòu)) 由Java虛擬機(jī)后端和調(diào)試平臺(tái)前端構(gòu)成
            1.Java虛擬機(jī)供應(yīng)了Java調(diào)試的功用
            2.調(diào)試平臺(tái)經(jīng)過(guò)調(diào)試交互和談向Java虛擬機(jī)懇求效勞以對(duì)在虛擬機(jī)中運(yùn)轉(zhuǎn)的順序進(jìn)行調(diào)試
            JPDA的構(gòu)架
            JPDA經(jīng)過(guò)兩個(gè)接口和和談來(lái)完成如上的闡明,辨別是JVMTI(Java虛擬機(jī)東西接口)、JDWP(Java調(diào)試連線和談)和JDI(Java調(diào)試接口)。
            1.JVMTI界說(shuō)了虛擬機(jī)應(yīng)該供應(yīng)的調(diào)試效勞,包羅調(diào)試信息(Information譬如棧信息)、調(diào)試行為(Action譬如客戶端設(shè)置一個(gè)斷點(diǎn))和告訴(Notification譬如抵達(dá)某個(gè)斷點(diǎn)時(shí)告訴客戶端),該接口由虛擬機(jī)完成者供應(yīng)完成,并連系在虛擬機(jī)中
          2.JDWP界說(shuō)調(diào)試效勞和調(diào)試器之間的通訊,包羅界說(shuō)調(diào)試信息花樣和調(diào)試懇求機(jī)制
          3.JDI在言語(yǔ)的高條理上界說(shuō)了調(diào)試者可以運(yùn)用的調(diào)試接口以能便利地與長(zhǎng)途的調(diào)試效勞進(jìn)行交互,Java言語(yǔ)完成,調(diào)試器完成者可直接運(yùn)用該接口拜訪虛擬機(jī)調(diào)試效勞。

            運(yùn)轉(zhuǎn)方法
            當(dāng)虛擬機(jī)的調(diào)試效勞運(yùn)轉(zhuǎn)時(shí),虛擬機(jī)作為調(diào)試的效勞供應(yīng)端,監(jiān)聽(tīng)一個(gè)銜接,而調(diào)試器經(jīng)過(guò)該銜接與虛擬機(jī)進(jìn)行交互。當(dāng)前,Windows平臺(tái)的JVM供應(yīng)了兩種方法的銜接:共享內(nèi)存和 Socket銜接,共享內(nèi)存的效勞供應(yīng)端和調(diào)試端只能位于統(tǒng)一臺(tái)機(jī),而Socket銜接則支撐分歧異機(jī)調(diào)試,即長(zhǎng)途調(diào)試。

            虛擬機(jī)參數(shù)設(shè)置
            1.啟用調(diào)試效勞
              -Xdebug 啟用調(diào)試
              -Xrunjdwp:<sub-options> 加載JVM的JPDA參考完成庫(kù)
            2.Xrunjdwp子參數(shù)(sub-options)裝備
              Xrunjdwp子參數(shù)的裝備花樣如下
              -Xrunjdwp:[=],[=]...

            幾個(gè)例子
            -Xrunjdwp:transport=dt_socket,server=y,address=8000
            在8000端口監(jiān)聽(tīng)Socket銜接,掛起VM而且不加載運(yùn)轉(zhuǎn)主函數(shù)直到調(diào)試懇求抵達(dá)
            -Xrunjdwp:transport=dt_shmem,server=y,suspend=n
            選擇一個(gè)可用的共享內(nèi)存(由于沒(méi)有指address)并監(jiān)聽(tīng)該內(nèi)存銜接,還加載運(yùn)轉(zhuǎn)主函數(shù)
            -Xrunjdwp:transport=dt_socket,address=myhost:8000
            銜接到myhost:8000供應(yīng)的調(diào)試效勞(server=n,以調(diào)試客戶端存在),掛起VM而且不加載運(yùn)轉(zhuǎn)主函數(shù)
            -Xrunjdwp:transport=dt_shmem,address=mysharedmemory
            經(jīng)過(guò)共享內(nèi)存的方法銜接到調(diào)試效勞,掛起VM而且不加載運(yùn)轉(zhuǎn)主函數(shù)
            -Xrunjdwp:transport=dt_socket,server=y,address=8000,
            onthrow=java.io.IOException,launch=/usr/local/bin/debugstub
            等候java.io.IOException被拋出,然后掛起VM并監(jiān)聽(tīng)8000端口銜接,在接到調(diào)試懇求后以敕令/usr/local/bin/debugstub dt_socket myhost:8000執(zhí)行
            -Xrunjdwp:transport=dt_shmem,server=y,onuncaught=y,launch=d:\\bin\\debugstub.exe
            等候一個(gè)RuntimeException被拋出,然后掛起VM并監(jiān)聽(tīng)一個(gè)可用的共享內(nèi)存,在接到調(diào)試懇求后以敕令d:\\bin\\debugstub.exe dt_shmem

          執(zhí)行,
          是可用的共享內(nèi)存

            啟動(dòng)tomcat
          -Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=n

          以上兩行是tomcat5.5.12的catalina.bat文件中的一句,可以看出tomcat在JPDA方法下是怎樣啟動(dòng)的,啟動(dòng)tomcat要用catalina jpda start來(lái)啟動(dòng),不克不及用startup.bat啟動(dòng),啟動(dòng)前設(shè)置好JPDA_TRANSPORT,JPDA_ADDRESS就OK了

          -------------------------------------
          Java長(zhǎng)途調(diào)試
          其實(shí)就是運(yùn)用了JDK的JPDA,在啟動(dòng)效勞器(Jboss或許Tomcat等)的敕令行參數(shù)里面加上:
          -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n

          以Eclipse作為調(diào)試東西的話,創(chuàng)立一個(gè)Remote Java Application,銜接參數(shù)填寫準(zhǔn)確的IP和端口(就是上面的8787)就行了

          起首,JAVA本身支撐調(diào)試功用,并供應(yīng)了一個(gè)簡(jiǎn)略的調(diào)試東西--JDB,相似于功用強(qiáng)壯的GDB,JDB也是一個(gè)字符界面的調(diào)試情況,并支撐設(shè)置斷點(diǎn),支撐線程線級(jí)的調(diào)試。
          ------------------------------------------------
          JAVA的調(diào)試辦法如下:
          1。起首支撐JVM,并設(shè)置參數(shù),使之任務(wù)在DEBUG形式下,參加參數(shù):-Xdebug -Xrunjdwp,transport=dt_socket,server=y,address=5432,suspend=n,onthrow=java.io.IOException,launch=/sbin/echo
          個(gè)中,-Xdebug是告訴JVM任務(wù)在DEBUG形式下,-Xrunjdwp是告訴JVM運(yùn)用(java debug wire protocol)來(lái)運(yùn)轉(zhuǎn)調(diào)試情況。該參數(shù)還了一系列的調(diào)試選項(xiàng):
          transport指定了調(diào)試數(shù)據(jù)的傳送方法,dt_socket是指用SOCKET形式,尚有dt_shmem指用共享內(nèi)存方法,個(gè)中,dt_shmem只合用于Windows平臺(tái)。
          server參數(shù)是指能否支撐在server形式的VM中.
          onthrow指明,當(dāng)發(fā)生該類型的Exception時(shí),JVM就會(huì)中綴下來(lái),進(jìn)行調(diào)式。該參數(shù)可選。
          launch指明,當(dāng)JVM被中綴下來(lái)時(shí),執(zhí)行的可執(zhí)行順序。該參數(shù)可選
          suspend指明,能否在調(diào)試客戶端樹(shù)立起來(lái)后,再執(zhí)行JVM。
          onuncaught(=y或n)指明呈現(xiàn)uncaught exception 后,能否中綴JVM的執(zhí)行.

          2。啟動(dòng)調(diào)試東西。
          最簡(jiǎn)略的調(diào)試東西就是上面提到的JDB,以上述調(diào)試用JVM為例,可以用下面的命運(yùn)轉(zhuǎn)啟動(dòng)JDB:
          jdb -connect com.sun.jdi.SocketAttach:port=5432,hostname=192.168.11.213
          別的,還有很多的可視化調(diào)試東西,如 eclipse,jsawt等等。Eclipses可用 ant debug來(lái)樹(shù)立一個(gè)調(diào)試辦法。

          posted on 2012-01-27 07:32 李林 閱讀(164) 評(píng)論(0)  編輯  收藏


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 日土县| 波密县| 高平市| 柳江县| 长垣县| 桃源县| 阳原县| 都江堰市| 芜湖市| 外汇| 仙居县| 仙桃市| 汕头市| 洛南县| 新营市| 台安县| 义马市| 金塔县| 奇台县| 蒙山县| 济宁市| 吴堡县| 德昌县| 宜城市| 绥滨县| 南宫市| 通道| 渑池县| 建昌县| 保定市| 湖北省| 舒城县| 夏河县| 海晏县| 汤原县| 乐安县| 湖口县| 耒阳市| 佛山市| 古丈县| 筠连县|