Bagaimana cara mengetahui dari mana fungsi dipanggil (backtrace / stacktrace)?

10

Saya telah menemukan masalah bahwa wilayah dinonaktifkan (dalam mode tanda-transien). Fungsi deactivate-markdipanggil dan saya ingin mencari tahu dari mana (dan mengapa) itu dipanggil.

Saya mencoba M-x debug-on-entry RET deactivate-markdan berhenti tetapi saya tidak menemukan cara untuk mengetahui penelepon. Seluruh stacktrace yang ditampilkan adalah:

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

Saya mencoba M-x edebug-eval-defuntetapi Edebug tidak menunjukkan penelepon juga.

Bagaimana saya mengetahui mengapa (dari mana) deactivate-markdisebut? Saya mencari fungsi backtrace atau stacktrace.

EDIT:

Sebuah advice-addtrik:

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

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

menghasilkan nildalam *Messages*.

Edit: info lebih lanjut tentang deactivate-mark: http://emacshorrors.com/posts/deactivate-mark.html

Gracjan Polak
sumber
1
Saya dapat mereproduksi perilaku dan output yang dijelaskan. Jalankan emacs -Q, nyalakan debug M-x debug-on-entry deactivate-mark, aktifkan tanda C-<SPC>, ketikkan karakter.
Andrew Swann
Anda bisa memberi saran deactiveate-markdan dalam fungsi saran Anda gunakan backtrace-framesuntuk mendapatkan tampilan dari seluruh tumpukan panggilan jika edebug tidak menunjukkan apa yang Anda harapkan.
Jordon Biondo
Menambahkan edit tentang advice-adddan backtrace-frame. Itu tidak membantu.
Gracjan Polak
Mengenai reproduksi dari @AndrewSwann, perlu dicatat bahwa mengetik karakter biasanya berjalan self-insert-commanddan "self-insert-command adalah fungsi built-in interaktif dalam 'kode sumber C'." Ini, bersama dengan perilaku lain yang dicatat sejauh ini, menunjukkan bahwa seseorang harus melakukan debug gdb.
Joe Corneli
1
Dari membaca pertanyaan, sepertinya tanda sedang dinonaktifkan secara tak terduga. Sementara itu perilaku yang dijelaskan oleh @AndrewSwann sangat diharapkan (wilayah dinonaktifkan saat Anda mengetik sesuatu). Jika perilaku yang Anda dapatkan sesuai dengan perilaku Andrew, harap jelaskan apa yang ingin Anda lakukan.
Malabarba

Jawaban:

4

Dari command_loop_1dalam 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
  ...

Itu tampaknya menjadi satu-satunya tempat di mana Qdeactivate_markdisebut semua src/*.c. Jadi tebakan saya adalah apa yang Anda temui.


Catatan, saya bukan ahli Emacs C. Saya menjulurkan sekitar dengan gdb --args src/emacs -Qsetelah membaca Bagaimana mengkompilasi emacs dengan simbol-simbol debug? .

Joe Corneli
sumber