Вопрос по java – Есть ли в Java эквивалент asm nop?

30

Когда я программирую на C / C ++ с помощью Visual Studio, я часто использую__asm nop; Команда для вставкиnoop код для того, чтобы было что сломать. Например:

if (someCondition())
{
  __asm nop;
}

Я понятия не имею, что делать, когда возникает условие, но я хочу остановить выполнение и проверить текущее состояние. ИногдаsomeCondition() достаточно прост для создания условной точки останова, но условные точки останова значительно замедляют выполнение, к тому же это не всегда возможно.

Теперь в C # я врываюсь в отладчик напрямую, либо вызываяSystem.Diagnostics.Debugger.Break() или жеSystem.Diagnostics.Debugger.Launch().

Теперь я вынужден программировать на Java и до сих пор не нашел лучшей альтернативы, чем простоSystem.out.println("bla-bla") и установить точку останова там. Опять же, рассмотрим случай, когда условная точка останова неосуществима.

Итак, мне интересно - есть ли__asm nop или жеSystem.Diagnostics.Debugger.Break() альтернатива в Java?

@Neil - если я не ошибаюсь,DEBUG_BREAK() просто__asm int 3 - еще один из моих любимых. mark
@ Марк, вы правы в случае x86, но для других архитектур это то, что они используют. Neil
Это не относится к вашему вопросу, но в C / C ++ вы можете использовать DEBUG_BREAK (); макрос, который автоматически врывается в отладчик без необходимости добавлять точку останова вручную. Neil
Я использую System.out.println () в этом случае. Почему вы не хотите использовать это? Sandro

Ваш Ответ

5   ответов
4

Java интерпретирует это как пустой оператор:

;

Хотя, как отмечено в комментариях, Eclipse не позволит вам установить точку останова здесь. Если вы хотите что-то бесполезное, что вы можете поставить точку останова на это, что также приятно и легко напечатать, я предлагаю:

if(false){}

Ваш компилятор может предупредить вас, что это никогда не вводится, что может быть полезно для напоминания о том, чтобы вынуть его перед компиляцией для производства. Надеюсь это поможет!

2

Я разделяю это на новый ответ, потому что я удивлен, что никто еще не сказал это.Modern IDEs let you add logic to breakpoints! Вместо составления выделенногоif оператор только для отладки, разместите точку останова там, где вам действительно интересно, затем щелкните ее правой кнопкой мыши и выберите «Свойства точки останова»!

The right-click menu on OS X, with Breakpoint Properties at the bottom The Breakpoint Properties dialog, showing hit count, conditions, etc.

Error: User Rate Limit Exceededpushing me over the edge to being a trusted member
Error: User Rate Limit Exceeded
33

В байт-коде у вас естьnop инструкция, но нетnop утверждение на языке Java.

Вы можете добавить дополнительный; в отдельной строке, и код все равно будет компилироваться, но это не намного более значимо, чем добавление пустой строки.

Другой "ничего не делает" Заявление может быть:

assert true;

который не имеет побочных эффектов, и может быть отключен при выполнении программы.

Как выясняется,assert true похоже, не генерирует никаких инструкций байт-кода, что приводит к пропуску точек останова на assert true все вместе. Затмение, однако, может нарушить такое утверждение, как

assert Boolean.TRUE;

что довольно похоже.

Error: User Rate Limit Exceededstackoverflow.com/a/26172741/895245
Error: User Rate Limit ExceededjdbError: User Rate Limit ExceededVM Started: Unable to set deferred breakpoint com.example.Class1:11 : No code at line 11 in com.example.Class1.
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededEclipseError: User Rate Limit ExceededIDEAError: User Rate Limit Exceeded;.
5

Вы можете просто вставить любой произвольный оператор присваивания, который ничего не делает, например,

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

Отладчик будет рад сломаться на этом. посколькуt является локальным по отношению к блоку, у него не может быть никаких побочных эффектов (и он будет скомпилирован JIT из существующего в производственном коде).

Кроме того, вы можете написать статическую функцию, в которой постоянно установлена точка останова, так что вы можете просто сделать:

if (someCondition()) {
  breakPoint();
}
Error: User Rate Limit Exceeded;
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded;Error: User Rate Limit Exceeded
2

Я не нашел идеального решения для этого, но вот решение, которое мне нравится больше всего. Вероятно, неэффективно, но это позволяет вам установить точку останова, Eclipse не жалуется и не предупреждает, и с точки зрения читателя кода очевидно, что вы хотите сделать.

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

    }

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

Если я хочу предварительно установить точку останова, я ставлю условие перед:

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

Похожие вопросы