Як дізнатися, звідки викликається функція (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викликається? Я шукаю функцію зворотності або складності.

Редагувати:

advice-addтрюк:

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

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

виробляє nilв *Messages*.

Редагувати: більше інформації про deactivate-mark: http://emacshorrors.com/posts/deactivate-mark.html


1
Я можу відтворити описане поведінку та результат. Виконати emacs -Q, увімкнути налагодження M-x debug-on-entry deactivate-mark, активувати позначку C-<SPC>, ввести символ.
Ендрю Сванн

Ви можете порадити, deactiveate-markа також у своїй функції порад, backtrace-framesщоб отримати уявлення про весь стек викликів, якщо edebug не відображає те, що ви очікуєте.
Джордон Біондо

Додано редагування про advice-addта backtrace-frame. Це не допомогло.
Грачан Полак

Що стосується відтворення з @AndrewSwann, то варто відзначити, що введення символу, як правило, виконується, self-insert-commandа "самовстановлення-команда - це інтерактивна вбудована функція у" вихідному коді C "." Це, разом з іншою поведінкою, відзначеною до цього часу, говорить про те, що потрібно буде налагоджувати проблеми gdb.
Джо Корнелі

1
Прочитавши запитання, звучало так, ніби марка несподівано відключається. Тим часом поведінка, описана @AndrewSwann, ідеально очікується (регіон деактивується, коли щось набираєш). Якщо поведінка, яку ви отримуєте, відповідає Ендрю, будь ласка, уточніть, що ви хочете зробити.
Малабарба

Відповіді:


4

З command_loop_1в 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
  ...

Це, здається, єдине місце, куди Qdeactivate_markзакликають усіх src/*.c. Тож я здогадуюсь, що це те, у що ти стикаєшся.


Зверніть увагу, я не фахівець з Emacs C. Я понишпорив з gdb --args src/emacs -Qпісля прочитання Як скомпілювати Emacs налагоджування? .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.