假設要調試的apk的包名爲:com.github.androider
android
而且啓動當前appgit
命令行運行:github
$ adb shell ps | grep "com.github.androider"
shell
執行結果(第二列是進程號):bash
u0_a1423 4877 619 2613496 603872 0 0000000000 S com.github.androider
app
$ adb -d froward tcp:5005 jdwp:4877
tcp
tcp後面這個端口隨意設置,只要沒有被佔用就行ide
$ jdb -attach localhost:5005
spa
jdb 鏈接到剛纔設置的端口命令行
注意win上的連接命令是: jdb –connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=5005
經過上面的操做,jdb調試器已經能和手機上的進程通訊了。如今開始設置斷點調試。
用法: stop at :<line_number> 或 stop in .<method_name>[(argument_type,...)]
//用法:
stop at <class>:<line_number> 或
//
stop in <class>.<method_name>[(argument_type,...)]
複製代碼
例如: stop in com.github.androider.MainActivity.onCreate
或者帶參數: stop in com.github.androider.MainActivity.onCreate(android.os.Bundle)
刪除斷點clear com.github.androider.MainActivity.onCreate(android.os.Bundle)
next 跳過一行(跨過調用)
step 執行當前行,若是可進入就進入
step up 執行到當前方法返回到其調用者
stepi 執行當前指令,進入方法
cont 在一個斷點、異常或者步驟以後,會停留在下一個斷點處
where 獲取斷點以前的調用棧,
locals 輸出當前堆棧幀中的全部本地變量
print 顯示Java對象和原生值。 對於原生類型的變量或字段而言,將會打印實際的值;對於對象而言,將打印一個簡單的描述。請查看下方的dump命令以獲取關於對象的更多信息。
dump 對於原生值而言,該命令等同於print。對於對象而言,它會打印對象中每一個定義的字段的當前值。靜態字段和實例字段均包含在內
run [類 [參數]]
開始執行應用程序的主類
真幾把難用。。。
參考文章: tinylab.org/use-jdb-to-…