elisp – Edebug: ¿función del instrumento sin establecer un punto de interrupción?

Pregunta:

Si tengo un búfer con el contenido

(defun foo()
  (interactive)
  (bar)
  (message "foo"))

(defun bar()
  (interactive)
  (message "bar"))

… y llamar a eval-buffer con edebug-all-defs establecido en t , luego ambas llamadas a foo y bar me arrojan directamente al edebug-mode (a pesar de no haber establecido ningún punto de interrupción).

Por otro lado, si configuro edebug-all-defs en nil , evalúo el búfer con eval-buffer y luego edebug-all-defs manualmente la definición de foo con edebug-eval-defun ( Cu CMx ), las cosas funcionan un poco mejor: llamar a foo invoca el depurador, y la bar llamadas no. Sin embargo, cuando paso a través de foo , ahora no puedo ingresar a la función de bar (presumiblemente porque no ha sido instrumentado, el error es Don't know where `bar' is defined . Pasar por encima de la llamada a la bar funciona simplemente bien y da el resultado correcto).

¿Hay alguna forma de instrumentar todas las funciones en un búfer sin convertirlas en puntos de interrupción al mismo tiempo?

Emacs 24.4.1 en Debian Jessie. Ejecutar con -Q no parece marcar la diferencia.

Respuesta:

Entonces, parece que el problema en este caso estaba relacionado con la función que se declaró en un búfer que no tiene un archivo asociado, por lo que Emacs no pudo ubicar la definición. Así es como descubrí esto:

  1. Comencé buscando en la definición de edebug-step-in (descubrí que esta es la función llamada en modo de depuración cuando presiono i para ingresar al inspeccionar la página de ayuda para el modo de depuración (disponible presionando ? Mientras está en modo de depuración) .
  2. Así encontré edebug-instrument-callee , luego edebug-instrument-function , luego find-function-noselect , luego find-function-search-for-symbol , luego find-function-library y finalmente, symbol-file .
  3. symbol-file es la misma función que se usa para ubicar las referencias siempre que vea esas referencias resaltadas en un búfer de ayuda, o cuando llame a describe-function ( Ch f ).
  4. Luego intenté copiar lo symbol-file hace el symbol-file (aproximadamente, solo para convencerme de que estoy en el camino correcto):

     (defun my/defined-in-file (s) (car (cl-find-if (lambda (x) (cl-some (lambda (y) (eql s (if (symbolp y) y (cdr y)))) (cdr x))) load-history))) (my/defined-in-file 'symbol-file) "/usr/local/share/emacs/25.0.50/lisp/subr.elc"

    Los resultados resultaron positivos.

  5. Cuando intenté hacer lo mismo con las funciones, que se declararon en el búfer *scratch* , no obtuve resultados.
  6. De ahí la conclusión: la instrumentación automática durante la operación "step-in" debe haber fallado debido a que Emacs no pudo localizar el archivo fuente para la función.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım