Pytanie w sprawie java, debugging – Czy w java istnieje odpowiednik asop nop?

30

Kiedy programuję C / C ++ w Visual Studio, często używam__asm nop; polecenie wstawienianoop kod, aby mieć coś do załamania. Na przykład:

if (someCondition())
{
  __asm nop;
}

Nie mam pojęcia, co zrobić, gdy wystąpi warunek, ale chcę zatrzymać wykonanie i zbadać bieżący stan. CzasamisomeCondition() jest wystarczająco prosty, aby utworzyć warunkowy punkt przerwania, ale warunkowe punkty przerwania znacznie spowalniają wykonanie, poza tym nie zawsze jest to możliwe.

Teraz w C # włamuję się bezpośrednio do debuggera albo przez wywołanieSystem.Diagnostics.Debugger.Break() lubSystem.Diagnostics.Debugger.Launch().

Teraz jestem zmuszony do programowania Java i do tej pory nie znalazłem lepszej alternatywy niż tylko zrobićSystem.out.println("bla-bla") i ustaw tam punkt przerwania. Ponownie, rozważmy przypadek, gdy warunkowy punkt przerwania nie jest możliwy.

Więc zastanawiam się - czy istnieje__asm nop lubSystem.Diagnostics.Debugger.Break() alternatywa w Javie?

W tym przypadku używam System.out.println (). Dlaczego nie chcesz tego użyć? Sandro
@mark masz rację w przypadku x86, ale dla innych architektur jest to, czego używają. Neil
@Neil - jeśli się nie mylę,DEBUG_BREAK() jest tylko__asm int 3 - kolejny z moich ulubionych. mark
To nie ma znaczenia dla twojego pytania, ale w C / C ++ możesz użyć DEBUG_BREAK (); makro, które automatycznie włamie się do debuggera bez konieczności dodawania ręcznego punktu przerwania. Neil

Twoja odpowiedź

5   odpowiedzi
33

nop instrukcja, ale nie manop instrukcja w języku Java.

Możesz dodać dodatkowe; sam w sobie, a kod nadal będzie się kompilował, ale to nie ma większego znaczenia niż dodanie pustej linii.

Innym stwierdzeniem „nic nie robi” może być:

assert true;

który nie ma żadnych skutków ubocznych, i może zostać wyłączony podczas wykonywania programu.

Jak się okazuje,assert true nie wydaje się generować żadnych instrukcji kodu bajtowego, co powoduje, że punkty przerwania potwierdzają, że są pomijane razem. Eclipse jest jednak w stanie złamać oświadczenie takie jak

assert Boolean.TRUE;

co jest dość podobne.

Właściwie nawetjdb nie obsługuje tego, e. sol.:VM Started: Unable to set deferred breakpoint com.example.Class1:11 : No code at line 11 in com.example.Class1. Bass
+1, asercje wydają się być tym, czego potrzebujesz (łamanie debugowania) keyser
Od 2018 r. TeżZaćmienie (4.7) aniPOMYSŁ (2017.3) może się załamać;. Bass
Inną dobrą techniką jest stworzenie metody fikcyjnej, użycie jej wszędzie i umieszczenie punktu przerwania w metodzie:stackoverflow.com/a/26172741/895245 Ciro Santilli 新疆改造中心996ICU六四事件
5

które nic nie robi, np.

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

Debugger z przyjemnością się tym zajmie. Odt jest lokalny względem bloku, nie może mieć żadnych skutków ubocznych (i spowoduje skompilowanie JIT z powodu istnienia w kodzie produkcyjnym).

Alternatywnie, możesz napisać funkcję statyczną, która ma na stałe punkt przerwania, abyś mógł to zrobić:

if (someCondition()) {
  breakPoint();
}
W Eclipse Mars z „usuwaniem niepotrzebnych nawiasów” włączonym w formaterze lub zapisywaniem kroków pierwszy przykład zamienia się na „if (someCondition ()) int t = 0;” który jest nieprawidłowym kodem. simpleuser
lub po prostu dodaj operatora; mishadoff
Ani w innych IDE, na przykład w IntelliJ IDEA. gvlasov
Nie sądzę, że będziesz w stanie ustawić punkt przerwania na a; w Eclipse. aioobe
4

Java interpretuje to jako pustą instrukcję:

;

Chociaż, jak zauważono w komentarzach, Eclipse nie pozwoli ci ustawić tutaj punktu przerwania. Jeśli chcesz czegoś bezużytecznego, w którym możesz umieścić punkt przerwania, który jest również miły i łatwy do wpisania, sugeruję:

if(false){}

Twój kompilator może Cię ostrzec, że nigdy nie zostanie wprowadzony, co może być przydatne do przypomnienia ci, abyś go wyjął przed kompilacją do produkcji. Mam nadzieję że to pomoże!

2

ale oto rozwiązanie, które lubię najbardziej. Prawdopodobnie nie jest skuteczny, ale pozwala na umieszczenie punktu przerwania, Eclipse nie narzeka ani nie ostrzega, a z punktu widzenia czytnika kodu jest oczywiste, co chcesz zrobić.

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

    }

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

Jeśli chcę wstępnie ustalić punkt przerwania, stawiam warunek przed:

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

ponieważ jestem zaskoczony, że nikt tego jeszcze nie powiedział.Nowoczesne IDE pozwalają dodawać logikę do punktów przerwania! Zamiast kompilować dedykowaneif instrukcja tylko do debugowania, umieść punkt przerwania gdzieś, na czym ci zależy, a następnie kliknij go prawym przyciskiem myszy i wybierz Właściwości punktu przerwania!

Przez „Modern IDE” mam na myśli te, z którymi obecnie pracowałem: Eclipse, Xcode, NetBeans, IntelliJ i Visual Studio. Inni prawdopodobnie mają tę funkcję. Ben Leggiero
Meta: Dziękuję, kto głosował, zaspychając mnie na skraj bycia zaufanym członkiem 😄 Ben Leggiero

Powiązane pytania