O depurador do Eclipse sempre bloqueia no ThreadPoolExecutor sem nenhuma exceção óbvia, por quê?

209

Estou trabalhando nos meus projetos habituais no Eclipse, é um aplicativo J2EE, feito com Spring, Hibernate e assim por diante. Estou usando o Tomcat 7 por isso (sem motivo específico, não exploro nenhum novo recurso, só queria tentar isso). Toda vez que depuro meu aplicativo, acontece que o depurador do Eclipse aparece como se tivesse atingido um ponto de interrupção, mas não é o caso, na verdade, ele para em um arquivo de origem Java ThreadPoolExecutor. Não há rastreamento de pilha no console, apenas para. Então, se eu clicar em continuar, ele continuará e o aplicativo funcionará perfeitamente. Isto é o que mostra na janela do depurador:

Daemon Thread ["http-bio-8080"-exec-2] (Suspended (exception RuntimeException)) 
    ThreadPoolExecutor$Worker.run() line: 912   
    TaskThread(Thread).run() line: 619

Realmente não posso explicar isso, porque não estou usando ThreadPoolExecutornada. Deve ser algo do Tomcat, Hibernate ou Spring. É muito chato porque eu sempre tenho que continuar durante a depuração.

Alguma pista?

gotch4
fonte
1
@ AmosM.Carpenter não é Java EE, não JEE? Mesmo o seu próprio link parece sugerir então
eis

Respostas:

290

O rastreamento de pilha publicado indica que uma RuntimeException foi encontrada em um encadeamento do Daemon. Isso normalmente não é capturado em tempo de execução, a menos que o desenvolvedor original tenha capturado e manipulado a exceção.

Normalmente, o depurador no Eclipse é configurado para suspender a execução no local em que a exceção foi lançada, em todas as exceções não capturadas . Observe que a exceção pode ser tratada posteriormente, mais abaixo no quadro da pilha e pode não levar ao término do encadeamento. Isso seria causa do comportamento observado.

A configuração do comportamento do Eclipse é simples:
Vá para Janela > Preferências > Java > Depurar e desmarque Suspender execução em exceções não capturadas .

Vineet Reynolds
fonte
No meu caso, stackoverflow.com/questions/8911146/… não ajudou :-(
Gangnus
5
Arquivei o bug 384073 do Eclipse sobre isso, pois essencialmente torna essa opção inutilizável ao depurar aplicativos da Web.
Daniel Serodio
9
Desativar a opção "Suspender execução em exceções não capturadas" no Eclipse é uma solução alternativa ruim: e se você deseja que o Eclipse suspenda em exceções reais não capturadas, por exemplo, originárias de seu próprio código? Parece-me que este é um erro no Tomcat ...
3
@Luis: Eu me perguntava o mesmo! Conforme bugs.eclipse.org/bugs/show_bug.cgi?id=384073#c4 , é possível: desativar os pontos de interrupção globais, criar um novo ponto de interrupção em java.lang.Exception e aplicar um filtro exclusivo nesse novo ponto de interrupção criado.
Re
3
@ Daniel ... Talvez seja melhor registrar um problema com a equipe do Tomcat. Acho que este comportamento é novo no Tomcat 7 ... Eclipse faz o que é suposto fazer ... (nunca pensei que eu iria acabar defendendo Eclipse um dia ... :)
Stijn de Witt
47

Existe uma solução mais específica, que evita que o Eclipse seja RuntimeExceptionativado somente após uma determinada classe.

  1. Adicionar um novo ponto de interrupção de exceção na perspectiva Depuração
  2. Vá para o seu propriedades
  3. Vamos para Filtragem
  4. Em "Restringir aos locais selecionados", clique em " Adicionar classe "
  5. Adicionar java.util.concurrent.ThreadPoolExecutor
  6. Desmarque a caixa de seleção , o que significa que eles serão ignorados
EngineerBetter_DJ
fonte
1
Não consigo fazê-lo funcionar com o Tomcat 7 e o Eclipse / STS 3.4.0. Existem outras configurações necessárias? Esse ponto de interrupção deve estar registrado RuntimeException? Ele precisa ser ativado ou desativado? 'Locais capturados' e 'Locais não capturados' devem estar ativados ou desativados?
Henrik Heimbuerger
2
Parece que o ponto de interrupção da exceção precisa ser uma java.lang.RuntimeException, deve estar ativado, deve ser apenas para um local não capturado e não deve ter a classe java.util.concurrent.ThreadPoolExecutor marcada.
mario
Infelizmente no Ubuntu 14.04, o "Restringir aos locais selecionados" não está disponível para o Eclipse Luna 4.4.0.
eeezyy
2

Percebi que isso geralmente ocorre após a modificação dos arquivos do servidor (jsp ou java) e o STS tem problemas ao recarregar o aplicativo.

Isso geralmente leva à reinicialização do servidor para que ele sincronize as alterações.

Após a introdução do JRebel - parece ter desaparecido. Então, eu gostaria de pensar que é um problema reproduzível no STS ao codificar hotswapping no modo de depuração.

Ao remover o hotswapping nativo, ele elimina o problema com ele dentro da classe ThreadPoolExecutor.

DaCrazyCoder
fonte