Comment savoir d'où une fonction est appelée (backtrace / stacktrace)?

10

J'ai rencontré un problème de région désactivée (en mode marque transitoire). La fonction deactivate-markest appelée et je voudrais savoir d'où (et pourquoi) elle est appelée.

J'ai essayé M-x debug-on-entry RET deactivate-market ça s'arrête mais je n'ai trouvé aucun moyen de trouver l'appelant. Le stacktrace affiché est:

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

J'ai essayé M-x edebug-eval-defunmais Edebug ne montre pas non plus l'appelant.

Comment savoir pourquoi (d'où) deactivate-markest appelé? Je recherche la fonction backtrace ou stacktrace.

ÉDITER:

Une advice-addastuce:

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

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

produit nilen *Messages*.

Edit: plus d'informations sur deactivate-mark: http://emacshorrors.com/posts/deactivate-mark.html

Gracjan Polak
la source
1
Je peux reproduire le comportement et la sortie décrits. Exécutez emacs -Q, activez le débogage M-x debug-on-entry deactivate-mark, activez la marque C-<SPC>, tapez un caractère.
Andrew Swann,
Vous pouvez conseiller deactiveate-market utiliser dans votre fonction de conseil backtrace-framespour obtenir une vue de la pile d'appels entière si edebug ne montre pas ce que vous attendez.
Jordon Biondo
Ajout d'une modification sur advice-addet backtrace-frame. Cela n'a pas aidé.
Gracjan Polak
En ce qui concerne la reproduction de @AndrewSwann, il convient de noter que la saisie d'un caractère s'exécute généralement self-insert-commandet que "self-insert-command est une fonction intégrée interactive en 'code source C'". " Ceci, ainsi que l'autre comportement noté jusqu'à présent, suggère que l'on devra déboguer avec gdb.
Joe Corneli
1
À la lecture de la question, il semblait que Mark était inopinément désactivé. Pendant ce temps, le comportement décrit par @AndrewSwann est parfaitement attendu (la région est désactivée lorsque vous tapez quelque chose). Si le comportement que vous obtenez correspond à celui d'Andrew, veuillez préciser ce que vous voulez faire.
Malabarba

Réponses:

4

De l' command_loop_1intérieur 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
  ...

Cela semble être le seul endroit où Qdeactivate_markest appelé dans tous src/*.c. Donc, je suppose que c'est ce que vous rencontrez.


Remarque, je ne suis pas un expert sur Emacs C. J'ai fouillé avec gdb --args src/emacs -Qaprès avoir lu Comment compiler emacs avec des symboles de débogage? .

Joe Corneli
la source