Quando ocorre um erro dentro de um sentinela de processo ou durante o bloqueio de fontes, o Emacs não mostra um backtrace, apesar de debug-on-error
ter sido ativado anteriormente.
Entendo por que esses erros foram detectados, o mesmo erro pode ser acionado novamente ao tentar apresentar o backtrace. No entanto, quando eu quero realmente depurar esse erro, não é muito útil. Eu prefiro arriscar o Emacs a não responder, do que ter que trabalhar com isso:
error in process sentinel: Wrong type argument: stringp, nil
Afinal, posso começar uma segunda instância, se a primeira começar a enlouquecer. Um pouco mais de contexto ajudaria quando há muitos lugares em que esse erro poderia teoricamente ocorrer em uma sentinela.
Então, como posso forçar o Emacs a mostrar um retorno, mesmo nos casos em debug-on-error
que não tem efeito?
Respostas:
Para sentinelas de processo, acho que não há uma boa razão. Acho que é apenas um recurso que falta, por isso sugiro
M-x report-emacs-bug
.No caso do bloqueio de fonte, o problema é mais complicado, porque o que realmente acontece é que o erro é acionado durante o jit-lock, ou seja, durante a exibição novamente, e não podemos entrar facilmente no depurador naquele momento (IIRC em algum momento, Gerd tentou funcionou, mas ainda havia alguns problemas sérios). Portanto, você pode depurá-lo de uma das seguintes maneiras:
M-x jit-lock-debug-mode
que altera o jit-lock para executar logo após a exibição novamente, para que possamos entrar no depurador.M-: (setq font-lock-support-mode nil) RET
e desabilite + reativar o bloqueio de fonte. Dessa maneira, o bloqueio de fonte não usa mais o jit-lock, portanto, ele é executado durante o comando do usuário e não durante a exibição posterior subsequente.fonte
debug-on-error
parece funcionar bem em sentinelas de processo.--eval
mais que não--debug-init
. Também a sua solução não me ajuda a cair em um backtrace na minha real.emacs.d