1. 程式人生 > >Java命令列除錯程式

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

參考文章

  1. https://tech.meituan.com/android-remote-debug.html

  2. https://blog.csdn.net/arkblue/article/details/39718947

  3. https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/jdb.html

  4. https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javac.html#