Mac 上使用jdb 調試Android

0. 假設

假設要調試的apk的包名爲:com.github.androiderandroid

而且啓動當前appgit

1. 獲得目標app的進程號

命令行運行:github

$ adb shell ps | grep "com.github.androider"shell

執行結果(第二列是進程號):bash

u0_a1423 4877 619 2613496 603872 0 0000000000 S com.github.androiderapp

2. 設置端口轉發

$ adb -d froward tcp:5005 jdwp:4877tcp

tcp後面這個端口隨意設置,只要沒有被佔用就行ide

3. jdb 鏈接

$ jdb -attach localhost:5005spa

jdb 鏈接到剛纔設置的端口命令行

注意win上的連接命令是: jdb –connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=5005

4. 設置斷點

經過上面的操做,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)

5. 調試

  • next 跳過一行(跨過調用)

  • step 執行當前行,若是可進入就進入

  • step up 執行到當前方法返回到其調用者

  • stepi 執行當前指令,進入方法

  • cont 在一個斷點、異常或者步驟以後,會停留在下一個斷點處

  • where 獲取斷點以前的調用棧,

  • locals 輸出當前堆棧幀中的全部本地變量

  • print 顯示Java對象和原生值。 對於原生類型的變量或字段而言,將會打印實際的值;對於對象而言,將打印一個簡單的描述。請查看下方的dump命令以獲取關於對象的更多信息。

  • dump 對於原生值而言,該命令等同於print。對於對象而言,它會打印對象中每一個定義的字段的當前值。靜態字段和實例字段均包含在內

  • run [類 [參數]] 開始執行應用程序的主類

真幾把難用。。。

參考文章: tinylab.org/use-jdb-to-…

相關文章
相關標籤/搜索