¿Cómo averiguar desde dónde se llama una función (backtrace / stacktrace)?

10

Me encontré con un problema de que la región está desactivada (en modo de marca transitoria). Se deactivate-markllama a la función y me gustaría saber de dónde (y por qué) se llama.

Lo intenté M-x debug-on-entry RET deactivate-marky se detiene pero no encontré la manera de averiguar quién llamaba. Todo el seguimiento de pila mostrado es:

Debugger entered--entering a function:
* deactivate-mark()

Lo intenté M-x edebug-eval-defunpero Edebug tampoco muestra a la persona que llama.

¿Cómo puedo saber por qué deactivate-markse llama (de dónde) ? Estoy buscando la funcionalidad de traza inversa o traza de pila.

EDITAR:

Un advice-addtruco:

(defun message-show-backtrace ()
  (message "%s" (backtrace-frame 10)))

(advice-add deactivate-mark :before #'message-show-backtrace)

produce nilen *Messages*.

Editar: más información sobre deactivate-mark: http://emacshorrors.com/posts/deactivate-mark.html

Gracjan Polak
fuente
1
Puedo reproducir el comportamiento y la salida descritos. Ejecute emacs -Q, active la depuración M-x debug-on-entry deactivate-mark, active la marca C-<SPC>, escriba un carácter.
Andrew Swann
Puede asesorar deactiveate-marky utilizar su función de asesoramiento backtrace-framespara obtener una vista de toda la pila de llamadas si edebug no muestra lo que espera.
Jordon Biondo
Edición añadida sobre advice-addy backtrace-frame. No sirvió de nada.
Gracjan Polak
En cuanto a la reproducción de @AndrewSwann, vale la pena señalar que la escritura de un carácter generalmente se ejecuta self-insert-commandy "auto-inserción-comando es una función interactiva incorporada en 'código fuente C'". Esto, junto con el otro comportamiento observado hasta ahora, sugiere que habrá que depurar gdb.
Joe Corneli
1
Al leer la pregunta, parecía que Mark se estaba desactivando inesperadamente. Mientras tanto, el comportamiento descrito por @AndrewSwann es perfectamente esperado (la región se desactiva cuando escribe algo). Si el comportamiento que obtiene coincide con el de Andrew, aclare lo que quiere hacer.
Malabarba

Respuestas:

4

De command_loop_1adentro keyboard.c.

  ...
  if (!NILP (BVAR (current_buffer, mark_active))
  && !NILP (Vrun_hooks))
{
  /* In Emacs 22, setting transient-mark-mode to `only' was a
     way of turning it on for just one command.  This usage is
     obsolete, but support it anyway.  */
  if (EQ (Vtransient_mark_mode, Qidentity))
    Vtransient_mark_mode = Qnil;
  else if (EQ (Vtransient_mark_mode, Qonly))
    Vtransient_mark_mode = Qidentity;

  if (!NILP (Vdeactivate_mark))
    /* If `select-active-regions' is non-nil, this call to
       `deactivate-mark' also sets the PRIMARY selection.  */
    call0 (Qdeactivate_mark);
  else
  ...

Ese parece ser el único lugar donde Qdeactivate_markse llama en todos src/*.c. Así que supongo que esto es con lo que te estás encontrando.


Tenga en cuenta, no soy un experto en Emacs C. I hurgó con gdb --args src/emacs -Qdespués de leer Cómo compilar emacs con símbolos de depuración? .

Joe Corneli
fuente