Digamos que o emacs lança algum erro que eu não entendo. Ou talvez o erro diga "O valor do símbolo como variável é nulo: modos", mas há muitas ocorrências do símbolo modes
no meu código, portanto, preciso de algum contexto. O Emacs pode ser configurado para mencionar o número da linha do código lisp para que eu possa saber qual código está causando o erro?
Eu tentei fazer (setq stack-trace-on-error '(buffer-read-only))
e executei o código perpetrante em um esforço para obter um rastreamento de pilha. Nenhum rastreamento de pilha também.
Também tentei chamar edebug-defun
minha função e percorrê-la. Não é até sair da função que o erro é gerado.
(Na verdade, não estou tão interessado na causa do erro específico que estou enfrentando atualmente quanto no desenvolvimento de habilidades gerais de depuração para elisp. Por favor, informe sobre como posso ver um número de linha, um sexp ou um rastreamento de pilha de um elisp. erro.)
fonte
nil
debug-on-error
? Isso não ajuda?t
e, em seguida, proceder à eval uma função de arremesso de erro.)debug-ignored-errors
se não há erros. Se você definirdebug-on-signal
nãonil
, e foi o caso do outro código lidar com o erro, você poderá obter o erro antes do outro código.Respostas:
Emacs fornece uma boa quantidade de depuração instalações, incluindo
M-x toggle-debug-on-error
,M-x toggle-debug-on-quit
, depuração no sinal (que pode ser usado enviandoUSR2
a Emacs de fora),debug-on-entry
(de uma função),debug-on-message
(quando vendo um jogo específico regexp de uma mensagem) e, finalmente,debug
se como alternativa para instrumentar uma função comC-u C-M-x
.Ambos
debug
eedebug
oferecem funcionalidade suficiente para inspecionar o estado de Emacs ao avaliar o código que você está em interessado, hite
e introduzir uma expressão.No entanto, enquanto
edebug
pula para o lugar na função instrumentada e, portanto, fornece uma pista para onde procurar (o que é meio bobo, já que você já sabe exatamente o que instrumentou),debug
não faz isso. Fiz um hack menor depois de descobrir que, sempre quedebug
avalia um buffer, ele emite o valor do ponto associado ao erro; em outras palavras, usar essas informações no buffer pode fornecer um número de linha no backtrace!Com isso, a pergunta original no título deve ser respondida. Quanto ao seu problema em obter um retorno, em primeiro lugar, estou sem idéias úteis.
fonte
M-x debug
...? Então o que eu pressiono?debug
, você pode verificar visitando um arquivo elisp com defeito, fazendoM-x toggle-debug-on-error
eM-x eval-buffer
, em seguida, um backtrace com um número de linha na posição problemática deve aparecer.eval-buffer
? Por exemplo, se você apenas pressiona um atalho de teclado que executa um comando particular que falha e abre o depurador no*Backtrace*
tampão ..Talvez porque seja 2018 agora, mas no meu caso, eu só precisei ativar a depuração, como wasamasa sugeriu: Mx toggle-debug-on-error
Depois disso, o Mx eval-buffer no meu arquivo Elisp defeituoso deu contexto, fornecendo a posição do erro, assim:
Debugger entered--Lisp error: (invalid-read-syntax ")") eval-buffer() ; Reading at buffer position 523 [....]
Mx goto-char pula para a posição de erro:
M-x goto-char 523
fonte
Estendi a resposta do wasamasa para incluir informações adicionais:
fonte