8 Stimmen

JDB -- Wie bekomme ich eine Liste von Methoden, bevor ich das Programm ausführe?

Ich lerne gerade JDB und stoße dabei auf ein kleines Paradoxon. Nach dem Start von JDB (mit "jdb ClassName") sagen mir die meisten Tutorials, dass ich Folgendes eingeben soll

> Methoden Klassenname

um eine Liste der verfügbaren Methoden anzuzeigen, damit ich meine Haltepunkte setzen kann. Wenn ich das tue, antwortet JDB

Der Befehl 'methods' ist erst gültig, wenn die VM mit dem Befehl 'run' gestartet wird

Wenn ich natürlich "run" sage, bevor ich einen Haltepunkt setze, läuft er direkt durch; nicht sehr hilfreich. Das Einzige, was ich daraus schließen kann, ist, dass jdb erwartet, dass man seine Haltepunkte blind setzt, aber das scheint mir ein so grobes Versehen zu sein, dass ich darauf vertraue, dass ich einfach einen Befehl übersehe.

Vielen Dank!!! Joyce

2voto

James Lawson Punkte 7433

Beachten Sie, dass es zwei Möglichkeiten zum Erstellen einer Debugging-Sitzung (siehe die jdb-Dokumentation ).

  1. Anbringen von - Wir laden das Programm in eine virtuelle Maschine, es hört auf einem Port (z.B. 8000) auf. Dann laden wir in einer anderen Terminalsitzung jdb und verbinden es mit der JVM-Sitzung, indem wir den Port angeben.
    • in einer Terminsitzung: java -Xdebug -agentlib:jdwp=transport=dt_socket, address=8000,server=y,suspend=y ClassName
    • in einer zweiten Terminalsitzung: jdb -attach 8000
  2. Start von - Laden Sie jdb und teilen Sie ihm den Namen der zu ladenden Klasse mit.
    • in einer einzigen Terminalsitzung: jdb ClassName

Wenn Sie befestigen. dann brauchen Sie nicht die run Befehl.
Wenn Sie jedoch Starten dann können Sie hacer müssen die run (die virtuelle Maschine ist noch nicht gestartet worden).


Dieses Verhalten lässt sich ableiten aus man jdb :

laufen. - Nach dem Start jdb und setzen Sie alle notwendigen Haltepunkte, verwenden Sie diesen um die Ausführung der fehlerbereinigten Anwendung zu starten. Diese ist nur verfügbar, wenn jdb startet die fehlerbereinigte Anwendung (im Gegensatz zum Anhängen an eine bestehende VM) .

Aus diesem Grund erhalten Sie die Fehlermeldung. Sie gestartet den Debugger, benutzte aber nicht die run command . Einige Anleitungen sagen Ihnen fälschlicherweise, dass Sie Start jdb, vergessen aber, Ihnen mitzuteilen, dass Sie die run Befehl.


Im Folgenden wird gezeigt, wie man die Liste der Methoden erhält (vorausgesetzt, man hat main Methode in einer Klasse namens ClassName ).

  1. Anbringen von :
    jdb -attach 8000
    main[1] stop in ClassName.main
    main[1] cont
    main[1] methods ClassName

  2. Start von :
    jdb ClassName
    > stop in ClassName.main
    > run
    main[1] methods ClassName

Hinweis : Sehen Sie sich die Eingabeaufforderung von jdb an. Manchmal ist es > manchmal ist es wie main[1] . Wenn es > dann ist die VM noch nicht gestartet und Befehle wie classes , methods funktioniert erst dann, wenn Sie die run Befehl. Wenn die Eingabeaufforderung lautet main[1] ist die VM gestartet und die gewünschten Befehle funktionieren.


Das einzige, was ich daraus schließen kann, ist, dass jdb erwartet, dass Sie Ihre Haltepunkte blind setzen

Es ist schwierig, Unterbrechungen allein mit dem Debugger zu setzen. Sie müssen sich Ihren Quellcode an anderer Stelle ansehen. Wahrscheinlich kennen Sie den Namen mindestens einer Methode, bei der Sie einen Breakpoint setzen wollen, und setzen daher einen ersten Breakpoint mit stop in ClassName.MethodName . Wenn Sie nicht wissen, wo Sie unterbrechen sollen, können Sie immer einen Haltepunkt in Ihrer Hauptmethode setzen, indem Sie stop in ClassName.Main . Denken Sie daran, dass Sie bei laufendem Debugger weitere Haltepunkte setzen können. Sie können auch feststellen, dass die list Befehl nützlich - er zeigt den Quellcode an, der dem aktuellen Haltepunkttreffer entspricht.

1voto

PP. Punkte 10514

Ich hatte genau die gleiche Frage.

Also nach dem Laufen:

jdb -classpath build -sourcepath src MyClass

der von mir eingegebene Text ist unten in der jdb Sitzung:

\> **stop in MyClass.main**
Deferring breakpoint MyClass.main.
It will be set after the class is loaded.
> **run**
run MyClass
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
> 
VM Started: Set deferred breakpoint MyClass.main

Breakpoint hit: "thread=main", MyClass.main(), line=798 bci=0
798         MyClass singleton = new MyClass();

main\[1\] **list**
797     public static void main(String\[\] args) {
798 =>      MyClass singleton = new MyClass();
799

0voto

Carl Smotricz Punkte 64366

Wenn es Ihr eigenes Programm ist, das Sie debuggen, sollten Sie die Klassennamen kennen!

Wenn es sich um ein Programm handelt, für das Sie den Quellcode nicht haben, müssen Sie den Klassennamen kennen, der main() . Wenn es in einem Gefäß ist, das mit java -jar ist der Name dieser Klasse im Manifest des Jars enthalten.

Aber in Wirklichkeit laufen Sie jdb ClassName so dass Sie wissen werden Sie die Methode ClassName.main() . Oder?

Wenn es sich um ein Servlet in einem Webdienst handelt, ist die Klasse des Servlets in web.xml .

In jedem dieser Fälle sollten Sie also zumindest in der Lage sein, die allererste Methode zu erhalten. Dort können Sie dann den Rest finden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X