Java命令列除錯程式
第一部分 進入除錯模式
通過jre提供的jdb程式可以實現命令列除錯java程式。關於jdb的命令語法可以參考 官方文件。下面我講通過例項手把手將大家學會命令列除錯
Step 1 建立專案
1. mkdir -p ~/jdwp/src/main/java/com/jdwp/test
2. cd ~/jdwp/src/main/java/com/jdwp/test
3. touch Test.java
4. 編寫程式碼Test.java
package com.jdwp.test;
/**
* Created by jiangbin on 2018/6/29.
*/
public class Test {
public static void main(String[] args) {
int i = 0;
int j = 1;
int k = i+j;
System.out.println(k);
}
}
Step 2 編譯位元組碼
1. cd ~/jdwp
2. mkdir classes
3. javac -g src/main/java/com/jdwp/test/Test.java -d classes
-g引數表示生成debug資訊(這個很重要不能漏)
在classes資料夾下的com/jdwp/test/目錄下生成了Test.class
Step 3 執行並除錯
在此階段需要開啟兩個Terminal。一個用來執行java命令。一個用來執行jdb命令除錯
1. java命令開啟除錯模式(在Terminal1中)
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000 -cp classes/ com.jdwp.test.Test
如果命令列輸出以下內容表示進入除錯模式成功
Listening for transport dt_socket at address: 8000
2. 執行jdb命令(在Terminal2中)
jdb -attach 8000
如果命令列輸出以下內容表示成功
設定未捕獲的java.lang.Throwable
設定延遲的未捕獲的java.lang.Throwable
正在初始化jdb...
VM 已啟動: > 當前呼叫堆疊上沒有幀
main[1]
Step 4 除錯
這一步的操作都是在Terminal2中進行的
1. 設定斷點
輸入 stop in com.jdwp.test.Test.main(表示在Test的main方法打斷點)
命令列出現如下提示,表示斷點成功
正在延遲斷點com.jdwp.test.Test.main。
將在載入類後設置。
2. 執行命令
1.輸入next,next相當於執行一步方法
2.輸入locals,會列印方法本地變量表
3. ...更多命令
如何進入除錯模式相信大家都會了吧。jdb除了next locals兩命令。它有16個除錯命令。下面我就一一講解下
2. jdb命令全面分析
前面的內容通過例項告訴大家如何除錯程式。為了過程的連續性,不產生打斷,沒有過多的講解jdb的詳細內容。比如打斷點,前面講解了 在方法內打斷點,那如果想具體到行號,改如何設定。除錯的其他命令也沒有講解。下面我將為大家做一個比較全面的講解
1.設定斷點
stop in java.lang.String.length
stop in MyClass.<init>
stop in MyClass.<init>(java.lang.String) //帶引數的
stop at MyClass:10//在第1行中斷
在方法中用in 在行號上用at
2.命令
connectors – 列出此 VM 中可用的聯結器和傳輸
run [class [args]] – 開始執行應用程式的主類
threads [threadgroup] – 列出執行緒
thread – 設定預設執行緒
suspend [thread id(s)] – 掛起執行緒 (預設值: all)
resume [thread id(s)] – 恢復執行緒 (預設值: all)
where [ | all] – 轉儲執行緒的堆疊
wherei [ | all]– 轉儲執行緒的堆疊, 以及 pc 資訊
up [n frames] – 上移執行緒的堆疊
down [n frames] – 下移執行緒的堆疊
kill – 終止具有給定的異常錯誤物件的執行緒
interrupt – 中斷執行緒
print – 輸出表達式的值
dump – 輸出所有物件資訊
eval – 對錶達式求值 (與 print 相同)
set = – 向欄位/變數/陣列元素分配新值
locals – 輸出當前堆疊幀中的所有本地變數
classes – 列出當前已知的類
class – 顯示已命名類的詳細資料
methods – 列出類的方法
fields – 列出類的欄位
threadgroups – 列出執行緒組
threadgroup – 設定當前執行緒組
stop in .[(argument_type,…)] – 在方法中設定斷點
stop at : – 在行中設定斷點
clear .[(argument_type,…)] – 清除方法中的斷點
clear : – 清除行中的斷點
clear – 列出斷點
catch [uncaught|caught|all] | – 出現指定的異常錯誤時中斷
ignore [uncaught|caught|all] | – 對於指定的異常錯誤, 取消 ‘catch’
watch [access|all] . – 監視對欄位的訪問/修改
unwatch [access|all] . – 停止監視對欄位的訪問/修改
trace [go] methods [thread] – 跟蹤方法進入和退出。 – 除非指定 ‘go’, 否則掛起所有執行緒
trace [go] method exit | exits [thread] – 跟蹤當前方法的退出, 或者所有方法的退出 – 除非指定 ‘go’, 否則掛起所有執行緒
untrace [methods] – 停止跟蹤方法進入和/或退出
step – 執行當前行
step up – 一直執行, 直到當前方法返回到其呼叫方
stepi – 執行當前指令
next – 步進一行 (步過呼叫)
cont – 從斷點處繼續執行
list [line number|method] – 輸出原始碼
use (或 sourcepath) [source file path] – 顯示或更改源路徑
exclude [, … | “none”] – 對於指定的類, 不報告步驟或方法事件
classpath – 從目標 VM 輸出類路徑資訊
monitor – 每次程式停止時執行命令
monitor – 列出監視器
unmonitor