2010-10-12 23 views
9

我在使用模擬器上的android應用程序使用獨立Java調試器時遇到了麻煩。顯然,任何具有遠程功能的java調試器(如jdb(或jswat))都可以使用,按照以下步驟進行操作(按照我的理解,在閱讀這裏和那裏之後):使用「jdb -attach」(或jswat)調試android應用程序

1)打開模擬器,模擬器(ADB安裝)

2)在Dalvik服務器上翻(在模擬器上DDMS)

3),運行中註明 「DevTools」 應用程序 - > 「開發設置」 - >選擇您的應用程序想要調試,啓用「等待調試器」標誌

4)再次在模擬器中運行您的應用程序;它會阻塞,等待調試器附加,並且達爾維克將顯示一個由「紅色臭蟲」標記的新進程; 5)在達爾維克上,選擇紅色標記的進程;其調試端口因此被轉發到本地主機:8700

6)將調試器掛接到localhost:8700。使用jdb,您必須運行「jdb -attach 8700」

只要啓動調試器,模擬器上的應用就會解鎖。所以,似乎應用程序已經正確檢測到一個調試器,從而免費運行。

然而,它的意義在於它「自由運行」,也就是說,它不會等待調試器發出「運行」命令。所以我沒有機會設置任何斷點。

1得到以下提示後,我試着在應用程序的開始處放置等待循環,希望我有時間設置斷點。當我嘗試設置一個斷點時,jdb表示「延遲斷點XXX.YYY,它將在類被加載後設置。」,因爲應用程序還沒有運行。但是,如果我然後發出「運行」命令,則答案是「沒有暫停」,因爲該應用程序已在運行(而且的確如此)。

隨着jswat看不到人,這些消息,但最終的結果是一樣的:-(

不用說,「加多寶-attach」的作品就好了與本地主機上運行非Android Java應用程序。

任何提示(除了 「請用eclipse」)?

我只是缺少一個愚蠢的細節地方?

的應用程序是一個HelloWorld,打造命令是 「蟻調試」。

預先感謝您。

+0

適用於物理和虛擬設備:https://asantoso.wordpress.com/2009/09/26/using-jdb-with-adb-to-debugging-of-android-app-on-a-real -設備/ – 2018-02-19 19:15:44

回答

4

最好的辦法似乎是在你的.jdbrc文件中設置斷點,因爲這些被加載和延遲,你不必改變你的代碼來設置任意的延遲循環,試圖在調試器等待時捕獲調試器。我和你一樣,發現如果你在類名上設置了斷點,它就不起作用。它表示推遲到類被加載,但似乎jdb在類加載時從未得到通知。

但是它確實工作如果您在設置一個斷點在特定類和行號

。jdbrc文件:

 
stop in com.android.helloandroid.HelloAndroid 
stop at com.android.helloandroid.HelloAndroid:21 

第一行什麼也不做,正如你已經知道的那樣。第二行對我有用:

 
Initializing jdb ... 
*** Reading commands from /home/codeboy2k/.jdbrc 
Deferring breakpoint com.android.helloandroid.HelloAndroid. 
It will be set after the class is loaded. 
> Deferring breakpoint com.android.helloandroid.HelloAndroid:21. 
It will be set after the class is loaded. 
> > Set deferred breakpoint com.android.helloandroid.HelloAndroid:21 

Breakpoint hit: "thread= main", com.android.helloandroid.HelloAndroid.onCreate(), line=21 bci=11 

main[1] 

所以關鍵似乎是在斷點中使用特定的行號。試試看。希望它能幫助你併爲你工作。

0

是的,它的工作原理:-)非常感謝,codeboy2k!

我也做了更多的實驗,它似乎也適用於指定方法名稱(例如「stop in com.android.helloandroid.HelloAndroid.onCreate」)。 因此,關鍵技巧是在jdb的啓動文件中放置一個初始斷點,以便應用程序在該斷點處阻止,然後繼續實際的調試會話。

我也試過用jswat,正確的程序如下:加載源代碼,設置你的斷點(至少是初始的),然後將調試器附加到應用程序(與此同時等待調試器)。從那時起,應用程序將從一個斷點進入另一個斷點。然而,令人遺憾的是,jswat並沒有在源代碼本身上顯示這一進展:-(

0

當您啓動dalvik時,還可以在命令行上查找suspend = y JDWP選項...注意:沒有測試過這個,雖然達爾維克有能力暫停加載正確的命令行選項

0

我注意到我的非eclipse設置的一件事是,如果我仍然運行ADV,我可以調試會話(端口8700),但我不能得到斷點被擊中...關閉ADV,它的工作原理我不知道爲什麼,但這對我有用

Here是我的設置,現在版本17,但另一方面而不是相同的設置。