Debuggen Android App mit "jdb-Attach" (oder jswat)

9

Ich habe Probleme mit einem eigenständigen Java-Debugger mit Android-Apps auf dem Emulator. Offenbar könnte jeder remote-fähige Java-Debugger wie jdb (oder jswat) genutzt werden, indem man die folgenden Schritte ausführt (wie ich nach dem Lesen hier und da verstehe):

1) Schalten Sie den Emulator ein, installieren Sie Ihre App auf dem Emulator (adb install)

2) Schalten Sie den dalvik Server (ddms) ein

3) Führen Sie auf dem Emulator die App "DevTools" aus - & gt; "Entwicklungseinstellungen" - & gt; Wählen Sie die Anwendung aus, die Sie debuggen möchten, aktivieren Sie das Flag "Auf Debugger warten"

4) erneut im Emulator, führen Sie Ihre App; Es wird blockiert und wartet darauf, dass ein Debugger anlegt, und dalvik zeigt einen neuen Prozess an, der durch einen "roten Bug" gekennzeichnet ist.

5) Wählen Sie auf dalvik den rot markierten Prozess aus. Der Debug-Port wird somit an localhost: 8700

weitergeleitet

6) Haken Sie den Debugger an localhost: 8700. Mit jdb musst du "jdb -attach 8700" ausführen

Sobald der Debugger gestartet wird, entsperrt Ihre App auf dem Emulator. So scheint es, dass die App einen Debugger richtig erkannt hat und somit frei läuft.

Der Punkt ist jedoch, dass es "frei läuft", dh es wird nicht darauf warten, dass der Debugger einen "run" -Befehl ausgibt. Ich habe also keine Möglichkeit, Breakpoints einzurichten.

Nach den Hinweisen von 1 habe ich versucht, zu warten Schleifen zu Beginn meiner App, in der Hoffnung, ich hätte die Zeit, einen Haltepunkt zu setzen. Wenn ich versuche einen Haltepunkt zu setzen, sagt jdb "Haltepunkt XXX verschieben. YYY. Es wird gesetzt, nachdem die Klasse geladen wurde.", Da die App noch nicht läuft. Wenn ich dann aber einen "run" -Befehl ausspreche, lautet die Antwort "Nothing suspended", da die App bereits ausgeführt wurde (und zwar in der Tat).

Mit jswat sehen Sie nicht alle diese Nachrichten, aber das Endergebnis ist dasselbe: - (

Es ist unnötig zu sagen, dass "jdb -attach" gut mit nicht-android Java-Apps funktioniert, die auf localhost laufen.

Irgendwelche Hinweise (außer "Bitte benutzen Sie Eclipse")?

Verminde ich gerade ein dummes Detail irgendwo?

Die App ist eine HelloWorld, Build-Befehl ist "ant debug".

Vielen Dank im Voraus.

    
Giuseppe Ciaccio 12.10.2010, 09:46
quelle

4 Antworten

4

Der beste Weg scheint darin zu bestehen, den Haltepunkt in Ihrer .jdbrc-Datei zu setzen, da diese geladen und verzögert sind und Sie Ihren Code nicht ändern müssen, um willkürliche Verzögerungsschleifen zu setzen, die versuchen, den Debugger abzufangen. Ich habe, wie Sie, herausgefunden, dass es nicht funktioniert, wenn Sie Unterbrechungspunkte für einen Klassennamen setzen. Es wird gesagt, dass es verzögert wird, bis die Klasse geladen ist, aber dann scheint es, dass die jdb niemals benachrichtigt wird, wenn die Klasse geladen wird.

Es funktioniert jedoch , wenn Sie einen Haltepunkt an einer spezifischen Klassen- und Zeilennummer

setzen

in Ihrer .jdbrc-Datei:

%Vor%

Die erste Zeile tut nichts, wie Sie bereits wissen. Die zweite Zeile funktioniert für mich hier:

%Vor%

Der Schlüssel scheint also zu sein, bestimmte Zeilennummern in Ihren Breakpoints zu verwenden. Probieren Sie es aus. Hoffe, es hilft dir und arbeitet auch für dich.

    
Brian Onn 16.10.2010 11:44
quelle
0

Ja, es funktioniert :-) Vielen Dank, codeboy2k!

Ich habe auch mehr Experimente gemacht, und es scheint, dass es auch funktioniert, wenn Sie einen Methodennamen angeben (z. B. "stop in com.android.helloandroid.HelloAndroid.onCreate"). Der Schlüsseltrick besteht also darin, einen anfänglichen Haltepunkt in die Startup-Datei von jdb zu setzen, so dass die App an diesem Haltepunkt blockiert und dann mit der eigentlichen Debug-Sitzung fortfährt.

Ich habe es auch mit jswat versucht, und die korrekte Prozedur ist wie folgt: lade den Quellcode, richte deine Breakpoints ein (zumindest den ersten) und bringe den Debugger dann an die App an (die inzwischen auf die Debugger). Von nun an wird die App von einem Haltepunkt zum anderen gehen. Es ist jedoch bedauerlich, dass jswat diesen Fortschritt im Quellcode selbst nicht anzeigt: - (

    
Giuseppe Ciaccio 18.10.2010 08:38
quelle
0

Achten Sie auch auf die Option suspend = y JDWP in der Befehlszeile, wenn Sie dalvik starten ... Hinweis: Ich habe dies nicht getestet, obwohl dalvik die Möglichkeit hat, beim Laden mit den richtigen Befehlszeilenoptionen zu warten.

>     
Nigel Sheridan-Smith 13.10.2011 05:48
quelle
0

Eine Sache, die ich bei meinem Nicht-Eclipse-Setup bemerkt habe, ist, dass wenn ich den ADV noch laufe, ich die Debug-Sitzung anhängen kann (Port 8700), aber ich kann die Haltepunkte nicht erreichen ... schließen Sie den ADV und Es klappt. Ich habe keine Ahnung warum, aber das funktioniert für mich.

Hier ist mein Setup, falls es hilft. Ich bin jetzt auf Version 17, aber abgesehen davon ist es das gleiche Setup.

    
jonaskinny 09.05.2013 18:39
quelle

Tags und Links