JAVA總結學習筆記

          學問大,知識多

          基于遠程怎么調試JAVA呢?

          基于遠程怎么調試JAVA呢?
          JAVA的長途調試 基于Java Platform Debugger Architecture(JPDA:Java平臺調試架構)。 JVM 自身支撐指定參數來讓java順序以調試形式啟動。虛擬機運轉在調試形式下,你只需去銜接他的響應的監聽端口就可以了。

          像tomcat等效勞器也都供應了指定調試參數的設置辦法

          典型的調試參數如下
          -Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=n

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

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

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

          在 Eclipse 中也有長途調試 選項的了,“run” -》 “Open Debug Dialog” -》“Remote Java Application” 阿誰就是。
          在選項里面選定詳細的“項目” “代碼目次”等,填好ip、端口,最終點下面的“ 調試 ”按鈕就行了,啟動后下斷點,等等都和本機調試無異。留意的是本機的代碼和在長途機上運轉的代碼應該是一致的

          <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 <選項> <類> <參數>

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

          轉發給被調試歷程的選項:
              -v -verbose[:class|gc|jni]
                                啟用具體形式
              -D<稱號>=<值> 設置系統屬性
              -classpath <以 \";\" 分隔的目次>
                                列出要在個中查找類的目次
              -X<選項>        非規范目的 VM 選項

          <類> 是要開端調試的類的稱號
          <參數> 是傳遞給 <類> 的 main() 辦法的參數

          要取得敕令協助,請在 jdb 提醒符下鍵入 \'help\'

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

          run [類 [參數]]        -- 開端執行使用順序的主類

          threads [線程組]     -- 列出線程
          thread <線程 ID>        -- 設置默許線程
          suspend [線程 ID]    -- 暫停線程(默許值為 all)
          resume [線程 ID]     -- 恢復線程(默許值為 all)
          where [<線程 ID> | all] -- 轉儲線程的倉庫
          wherei [<線程 ID> | all] -- 轉儲線程的倉庫以及 pc
          up [n 幀]             -- 向上挪動線程的倉庫
          down [n 幀]           -- 向下挪動線程的倉庫
          kill <線程 ID> <表達式>   -- 中止具有給定的異常對象
          interrupt <線程 ID>     -- 中綴線程

          print <表達式>              -- 輸出表達式的值
          dump <表達式>               -- 輸出一切對象信息
          eval <表達式>               -- 核算表達式的值(與
          set = <表達式>     -- 為字段/變量/數組元素
          locals                    -- 輸出當時倉庫幀中的一切

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

          threadgroups              -- 列出線程組
          threadgroup <稱號>        -- 設置當時線程組

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

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

          monitor <敕令>         -- 每次順序中止時執行敕令
          monitor                   -- 列出看管器
          unmonitor <看管器號>      -- 刪除某個看管器
          read <文件名>           -- 讀取并執行某個敕令文件

          lock <表達式>               -- 輸出對象的鎖信息
          threadlocks [線程 ID]   -- 輸出線程的鎖信息

          pop                       -- 彈出整個倉庫,且包括當
          reenter                   -- 與 pop 效果一樣,但重
          redefine <類 ID> <類文件名>
                                    -- 從新界說類代碼

          disablegc <表達式>          -- 制止對象的渣滓收受接管
          enablegc <表達式>           -- 答應對象的渣滓收受接管

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

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

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

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


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

            運轉方法
            當虛擬機的調試效勞運轉時,虛擬機作為調試的效勞供應端,監聽一個銜接,而調試器經過該銜接與虛擬機進行交互。當前,Windows平臺的JVM供應了兩種方法的銜接:共享內存和 Socket銜接,共享內存的效勞供應端和調試端只能位于統一臺機,而Socket銜接則支撐分歧異機調試,即長途調試。

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

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

          執行,
          是可用的共享內存

            啟動tomcat
          -Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=n

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

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

          以Eclipse作為調試東西的話,創立一個Remote Java Application,銜接參數填寫準確的IP和端口(就是上面的8787)就行了

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

          2。啟動調試東西。
          最簡略的調試東西就是上面提到的JDB,以上述調試用JVM為例,可以用下面的命運轉啟動JDB:
          jdb -connect com.sun.jdi.SocketAttach:port=5432,hostname=192.168.11.213
          別的,還有很多的可視化調試東西,如 eclipse,jsawt等等。Eclipses可用 ant debug來樹立一個調試辦法。

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


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


          網站導航:
           
          主站蜘蛛池模板: 金阳县| 新河县| 色达县| 余江县| 清丰县| 廊坊市| 镇平县| 读书| 秭归县| 吉木萨尔县| 白水县| 商都县| 合川市| 汶川县| 新疆| 巫山县| 县级市| 沿河| 新和县| 疏附县| 彭州市| 桂林市| 鹰潭市| 呼和浩特市| 朔州市| 阿克| 乐至县| 江都市| 安国市| 开江县| 沁源县| 楚雄市| 潍坊市| 米林县| 哈尔滨市| 白河县| 浙江省| 枣阳市| 德江县| 内丘县| 霍州市|