Bir işlevin nereden çağrıldığını nasıl öğrenebilirim (backtrace / stacktrace)?


10

Bölgenin devre dışı bırakılmasıyla ilgili bir sorunla karşılaştım (geçici işaret modunda). İşlev deactivate-markçağrılır ve nereden (ve neden) çağrıldığını bulmak istiyorum.

Denedim M-x debug-on-entry RET deactivate-markve duruyor ama arayanı bulmanın bir yolunu bulamadım. Görüntülenen yığın izinin tamamı:

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

Denedim M-x edebug-eval-defunama Edebug da arayanı göstermiyor.

Neden (nereden) deactivate-markçağrıldığını nasıl öğrenebilirim ? Backtrace veya stacktrace işlevlerini arıyorum.

DÜZENLE:

Bir advice-addnumara:

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

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

üretmektedir niliçinde *Messages*.

Düzenleme: hakkında daha fazla bilgi deactivate-mark: http://emacshorrors.com/posts/deactivate-mark.html


1
Açıklanan davranış ve çıktıyı yeniden üretebilirim. Çalıştırın emacs -Q, hata ayıklamayı açın M-x debug-on-entry deactivate-mark, işareti etkinleştirin C-<SPC>, bir karakter yazın.
Andrew Swann

deactiveate-markTavsiye edebilir ve tavsiye işlevinizde backtrace-framesedebug beklediğinizi göstermiyorsa tüm çağrı yığınını görmek için kullanın .
Jordon Biondo

Hakkında düzenleme eklendi advice-addve backtrace-frame. Yardım etmedi.
Gracjan Polak

@AndrewSwann'ın çoğaltılmasıyla ilgili olarak, bir karakter yazmanın tipik olarak çalıştığını self-insert-commandve "self-insert-command 'C kaynak kodu'nda " etkileşimli yerleşik bir işlev olduğunu belirtmek gerekir . Bu, şimdiye kadar kaydedilen diğer davranışlarla birlikte, bir kişinin hata ayıklaması gerektiğini göstermektedir gdb.
Joe Corneli

1
Soruyu okuduktan sonra, işaretin beklenmedik bir şekilde devre dışı bırakıldığı anlaşılıyor. Bu arada @AndrewSwann tarafından açıklanan davranış mükemmel bir şekilde beklenir (bir şey yazdığınızda bölge devre dışı bırakılır). Aldığınız davranış Andrew'la eşleşiyorsa, lütfen ne yapmak istediğinizi açıklayın.
Malabarba

Yanıtlar:


4

Gönderen command_loop_1içinde 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
  ...

Hepsi Qdeactivate_markdenilen tek yer burası gibi görünüyor src/*.c. Benim tahminim şudur bu, içine girdiğiniz şey.


Not, ben Emacs C. I uzmanı değilim kurcaladım ile gdb --args src/emacs -Qokuduktan sonra hata ayıklama simgeleri ile emacs'ı derlemek nasıl? .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.