Pergunta sobre java, debugging – Existe um equivalente nop asm em java?

30

Quando eu programo C / C ++ com o Visual Studio, eu geralmente uso__asm nop; comando para inserir umnoop código para ter algo para quebrar. Por exemplo:

if (someCondition())
{
  __asm nop;
}

Eu não tenho idéia do que fazer quando a condição ocorre, mas eu quero parar a execução e examinar o estado atual. As vezessomeCondition() é simples o suficiente para criar um ponto de interrupção condicional, mas os pontos de interrupção condicionais diminuem a execução significativamente, além de nem sempre ser possível.

Agora, em c # eu invadi o depurador diretamente ou chamandoSystem.Diagnostics.Debugger.Break() ouSystem.Diagnostics.Debugger.Launch().

Agora sou forçado a programar Java e até agora não encontrei alternativa melhor do que apenasSystem.out.println("bla-bla") e defina um ponto de interrupção lá. Novamente, considere o caso em que um ponto de interrupção condicional não é viável.

Então, eu me pergunto - existe uma__asm nop ouSystem.Diagnostics.Debugger.Break() alternativa em Java?

Eu uso System.out.println () neste caso. Por que você não quer usar isso? Sandro
@ Neil - se não me engano,DEBUG_BREAK() é apenas__asm int 3 - outro dos meus favoritos. mark
@mark você está correto no caso do x86, mas para outras arquiteturas é o que eles usam. Neil
Não é relevante para sua pergunta, mas em C / C ++ você pode usar o DEBUG_BREAK (); macro que entrará no depurador automaticamente sem que você tenha que adicionar um ponto de interrupção manual. Neil

Sua resposta

5   a resposta
2

nguém tenha dito isso ainda.IDEs modernos permitem adicionar lógica aos pontos de interrupção! Em vez de compilar umif declaração apenas para depuração, coloque o ponto de interrupção em algum lugar que você realmente se preocupa, clique com o botão direito nele e selecione Propriedades do ponto de interrupção!

Meta: Obrigado, quem votou nisso, porempurrando-me ao limite para ser um membro de confiança 😄 Ben Leggiero
Por "IDEs modernos", quero dizer aqueles com os quais eu trabalhei atualmente: Eclipse, Xcode, NetBeans, IntelliJ e Visual Studio. Outros provavelmente também têm esse recurso. Ben Leggiero
33

nop instrução, mas não hánop declaração na linguagem Java.

Você pode adicionar um extra; em uma linha por si só e o código ainda irá compilar, mas isso não é muito mais significativo do que adicionar uma linha vazia.

Outra declaração "não faz nada" poderia ser:

assert true;

que não tem efeitos colaterais, e pode ser desligado ao executar o programa.

Como se constata,assert true não parece gerar nenhuma instrução bytecode, o que faz com que os pontos de quebra em assert true sejam ignorados todos juntos. O Eclipse é, no entanto, capaz de quebrar uma declaração como

assert Boolean.TRUE;

que é bem parecido.

+1, asserções parece ser o que você precisa (quebra de depuração) keyser
Na verdade, mesmojdb não suporta isso, e. g .:VM Started: Unable to set deferred breakpoint com.example.Class1:11 : No code at line 11 in com.example.Class1. Bass
A partir de 2018, nenhum dos doisEclipse (4.7) nemIDÉIA (2017.3) pode quebrar;. Bass
Outra boa técnica é fazer um método fictício, usá-lo em todos os lugares e colocar o ponto de interrupção no método:stackoverflow.com/a/26172741/895245 Ciro Santilli 新疆改造中心996ICU六四事件
4

Java interpreta isso como uma instrução vazia:

;

Embora, como observado nos comentários, o Eclipse não permitirá que você defina um ponto de interrupção aqui. Se você quer algo inútil que você pode colocar um ponto de interrupção em que também é agradável e fácil de digitar, sugiro:

if(false){}

Seu compilador pode avisá-lo que isso nunca é inserido, o que pode ser útil para lembrá-lo de retirá-lo antes de compilar para produção. Espero que isto ajude!

5

rária que não faça nada, por ex.

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

O depurador ficará feliz em quebrar isso. Desde at é local para o bloco, ele não pode ter efeitos colaterais (e obterá JIT-compilado fora de existência no código de produção).

Alternativamente, você pode escrever uma função estática que tem um ponto de interrupção permanentemente definido dentro dela, então você pode apenas fazer:

if (someCondition()) {
  breakPoint();
}
ou apenas adicione operador; mishadoff
No Eclipse Mars, com "remover colchetes desnecessários" ativados no formatador ou salvar etapas, o primeiro exemplo se transforma em 'if (someCondition ()) int t = 0;' qual é o código inválido. simpleuser
Nem você pode em outros IDEs, por exemplo, no IntelliJ IDEA. gvlasov
Eu não acho que você será capaz de definir um ponto de interrupção em um; no Eclipse. aioobe
2

mas aqui está a solução que mais gosto. Provavelmente não é eficiente, mas permite que você crie um ponto de interrupção, o Eclipse não reclama ou avisa e, do ponto de vista do leitor de código, é óbvio o que você deseja fazer.

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

    }

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

Se eu quiser précondicionar o ponto de interrupção, coloco a condição antes:

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

Perguntas relacionadas