如何找出从(backtrace / stacktrace)调用函数的位置?


10

我遇到了一个问题,即区域被停用(在瞬态标记模式下)。该函数deactivate-mark被调用,我想知道从哪里(以及为什么)调用它。

我尝试了一下M-x debug-on-entry RET deactivate-mark,但它停止了,但是我找不到找到呼叫者的方法。整个显示的堆栈跟踪为:

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

我尝试过,M-x edebug-eval-defun但是Edebug也不显示调用方。

我如何找出为什么(从哪里)deactivate-mark被调用?我正在寻找backtrace或stacktrace的功能。

编辑:

一个advice-add窍门:

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

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

nil在产生*Messages*

编辑:有关更多信息deactivate-markhttp : //emacshorrors.com/posts/deactivate-mark.html


1
我可以重现所描述的行为和输出。运行emacs -Q,打开调试M-x debug-on-entry deactivate-mark,激活标记C-<SPC>,输入字符。
安德鲁·斯旺

您可以建议deactiveate-markbacktrace-frames如果edebug没有显示您的期望,则可以在建议功能中使用来查看整个调用堆栈。
Jordon Biondo

添加了有关advice-add和的修改backtrace-frame。它没有帮助。
Gracjan Polak

关于@AndrewSwann的复制,值得注意的是键入字符通常会运行,self-insert-command并且“ self-insert-command是'C源代码'中的交互式内置函数”。这与到目前为止提到的其他行为一起表明,必须使用进行调试gdb
Joe Corneli 2015年

1
通过阅读问题,听起来好像标记被意外停用了。同时,@ AndrewSwann描述的行为是完全可以预期的(键入内容时该区域被禁用)。如果您得到的行为与安德鲁的行为相符,请说明您要做什么。
马拉巴(Malabarba)

Answers:


4

command_loop_1keyboard.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
  ...

那似乎Qdeactivate_mark是所有地方唯一被调用的地方src/*.c。所以我的猜测是,这就是您正在遇到的问题。


请注意,我不是故意的Emacs C.我的专家戳周围gdb --args src/emacs -Q看完之后如何编译emacs的使用调试符号?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.