Frage an java, debugging – Gibt es ASM NOP-Äquivalent in Java?

30

Wenn ich C / C ++ mit Visual Studio programmiere, verwende ich oft__asm nop; Befehl zum Einfügen einesnein Code, um etwas zu brechen. Zum Beispiel:

if (someCondition())
{
  __asm nop;
}

Ich habe keine Ahnung, was zu tun ist, wenn die Bedingung eintritt, aber ich möchte die Ausführung stoppen und den aktuellen Status untersuchen. ManchmalsomeCondition() ist einfach genug, um einen bedingten Haltepunkt zu erstellen, aber bedingte Haltepunkte verlangsamen die Ausführung erheblich, außerdem ist dies nicht immer möglich.

Jetzt kann ich in C # direkt in den Debugger einsteigen, indem ich entweder aufrufeSystem.Diagnostics.Debugger.Break() oderSystem.Diagnostics.Debugger.Launch().

Jetzt bin ich gezwungen, Java zu programmieren und bis jetzt habe ich keine bessere Alternative gefunden als nur zu tunSystem.out.println("bla-bla") und dort einen Haltepunkt setzen. Denken Sie auch hier an den Fall, dass ein bedingter Haltepunkt nicht möglich ist.

Also, ich frage mich - gibt es eine__asm nop oderSystem.Diagnostics.Debugger.Break() Alternative in Java?

In diesem Fall verwende ich System.out.println (). Warum willst du das nicht benutzen? Sandro
Dies ist für Ihre Frage nicht relevant, aber in C / C ++ können Sie DEBUG_BREAK () verwenden. Makro, das automatisch in den Debugger eingebrochen wird, ohne dass Sie einen manuellen Haltepunkt hinzufügen müssen. Neil
@mark Sie sind im Fall von x86 korrekt, aber für andere Architekturen ist es das, was sie verwenden. Neil
@Neil - wenn ich mich nicht irre,DEBUG_BREAK() ist nur__asm int 3 - Ein weiterer meiner Favoriten. mark

Deine Antwort

5   die antwort
33

nop Anweisung, aber es gibt keinenop Anweisung in der Java-Sprache.

Sie können ein Extra hinzufügen; auf einer Zeile für sich und der Code wird immer noch kompiliert, aber das ist nicht viel sinnvoller als das Hinzufügen einer leeren Zeile.

Eine andere Aussage, die "nichts tut", könnte sein:

assert true;

Das hat überhaupt keine Nebenwirkungen und kann beim Ausführen des Programms ausgeschaltet werden.

Wie sich herausstellt,assert true scheint keine Bytecode-Anweisungen zu generieren, was dazu führt, dass Haltepunkte bei assert true insgesamt übersprungen werden. Eclipse ist jedoch in der Lage, eine Aussage wie z

assert Boolean.TRUE;

das ist ganz ähnlich.

Eigentlich sogarjdb unterstützt dies nicht, e. G.:VM Started: Unable to set deferred breakpoint com.example.Class1:11 : No code at line 11 in com.example.Class1. Bass
Eine andere gute Technik besteht darin, eine Dummy-Methode zu erstellen, sie überall zu verwenden und den Haltepunkt in die Methode einzufügen:stackoverflow.com/a/26172741/895245 Ciro Santilli 新疆改造中心996ICU六四事件
+1, Behauptungen scheinen das zu sein, was Sie brauchen (Fehlerbehebung) keyser
Ab 2018 auch nichtFinsternis (4.7) nochIDEE (2017.3) kann an brechen;. Bass
2

weil ich überrascht bin, dass noch niemand dies gesagt hat.Mit modernen IDEs können Sie Haltepunkten Logik hinzufügen! Anstatt ein dediziertes zu kompilierenif Anweisung nur zum Debuggen, platzieren Sie den Haltepunkt an einer Stelle, die Ihnen wirklich am Herzen liegt, klicken Sie mit der rechten Maustaste darauf und wählen Sie Haltepunkteigenschaften!

Meta: Danke, wer auch immer dafür gestimmt hatMich über den Rand drängen, um ein vertrauenswürdiges Mitglied zu sein 😄 Ben Leggiero
Mit "modernen IDEs" meine ich die, mit denen ich zurzeit gearbeitet habe: Eclipse, Xcode, NetBeans, IntelliJ und Visual Studio. Andere haben wahrscheinlich auch diese Funktion. Ben Leggiero
2

aber hier ist die Lösung, die mir am besten gefällt. Wahrscheinlich nicht effizient, aber Sie können einen Haltepunkt setzen, Eclipse beschwert sich nicht oder warnt, und aus Sicht des Codelesers ist klar, was Sie tun möchten.

    // Silly method that allows me to make noop
    private static void noop() {

    }

    public otherMethod() { 
            // Here I need breakpoint
            noop();
    }

Wenn ich einen Haltepunkt vorkonditionieren möchte, setze ich die Bedingung vor:

    public otherMethod() { 
            // Here I need breakpoint
            if(someCondition())
                noop();
    }
5

die nichts bewirkt, z.

if (someCondition()) {
  int t=0;
}

Der Debugger wird diesbezüglich gerne eine Pause einlegen. Schon seitt ist lokal für den Block, es kann möglicherweise keine Nebenwirkungen haben (und wird JIT-kompiliert, wenn es im Produktionscode existiert).

Alternativ können Sie eine statische Funktion schreiben, in der ein Haltepunkt dauerhaft festgelegt ist.

if (someCondition()) {
  breakPoint();
}
Weder Sie können in anderen IDEs, zum Beispiel in IntelliJ IDEA. gvlasov
Ich glaube nicht, dass Sie einen Haltepunkt auf einem setzen können; in Eclipse. aioobe
In Eclipse Mars wird das erste Beispiel mit der Option "Nicht benötigte Klammern entfernen" im Formatierer oder in den Speicherschritten zu "if (someCondition ()) int t = 0;" Das ist ungültiger Code. simpleuser
oder einfach Operator hinzufügen; mishadoff
4

Java interpretiert dies als leere Anweisung:

;

Wie in den Kommentaren erwähnt, können Sie in Eclipse hier jedoch keinen Haltepunkt festlegen. Wenn Sie etwas Nutzloses wollen, auf das Sie einen Haltepunkt setzen können, der auch schön und einfach zu tippen ist, schlage ich vor:

if(false){}

Ihr Compiler warnt Sie möglicherweise, dass dies niemals eingegeben wird. Dies kann hilfreich sein, um Sie daran zu erinnern, es vor dem Kompilieren für die Produktion zu entfernen. Hoffe das hilft!

Verwandte Fragen