จะทราบได้อย่างไรว่าฟังก์ชันใดถูกเรียกใช้จาก (backtrace / stacktrace)


10

ฉันพบปัญหาว่าภูมิภาคปิดใช้งาน (ในโหมดเครื่องหมายชั่วคราว) deactivate-markมีการเรียกใช้ฟังก์ชั่นและฉันต้องการทราบว่าถูกเรียกใช้จากที่ไหน (และทำไม)

ฉันพยายามM-x debug-on-entry RET deactivate-markแล้วก็หยุด แต่ฉันไม่พบวิธีการโทรหา stacktrace ที่แสดงทั้งหมดคือ:

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-mark: http://emacshorrors.com/posts/deactivate-mark.html


1
ฉันสามารถทำซ้ำพฤติกรรมที่อธิบายและเอาท์พุท เรียกใช้emacs -Qเปิด debug M-x debug-on-entry deactivate-markเปิดใช้งานเครื่องหมายC-<SPC>พิมพ์อักขระ
Andrew Swann

คุณสามารถให้คำแนะนำdeactiveate-markและในฟังก์ชั่นคำแนะนำของคุณใช้backtrace-framesเพื่อรับมุมมองของสายการโทรทั้งหมดถ้า edebug ไม่แสดงสิ่งที่คุณคาดหวัง
Jordon Biondo

ที่เพิ่มเข้ามาแก้ไขเกี่ยวกับและadvice-add backtrace-frameมันไม่ได้ช่วยอะไร
Gracjan Polak

เกี่ยวกับการทำสำเนาจาก @AndrewSwann เป็นที่น่าสังเกตว่าการพิมพ์อักขระมักจะทำงานself-insert-commandและ "self-insert-command เป็นฟังก์ชันในตัวแบบโต้ตอบใน 'ซอร์สโค้ด C' พร้อมกับพฤติกรรมอื่น ๆ gdbตั้งข้อสังเกตเพื่อให้ห่างไกลให้เห็นว่าหนึ่งจะต้องแก้ปัญหาด้วย
Joe Corneli

1
จากการอ่านคำถามดูเหมือนว่าเครื่องหมายถูกปิดการใช้งานโดยไม่คาดคิด ในขณะเดียวกันคาดว่าพฤติกรรมที่อธิบายโดย @AndrewSwann สมบูรณ์แบบ (ภูมิภาคจะถูกปิดการใช้งานเมื่อคุณพิมพ์บางอย่าง) หากพฤติกรรมของคุณตรงกับแอนดรูว์กรุณาอธิบายสิ่งที่คุณต้องการทำ
Malabarba

คำตอบ:


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 ซีผมแหย่ไปรอบ ๆด้วยgdb --args src/emacs -Qหลังจากอ่านวิธีการรวบรวม emacs ที่มีสัญลักษณ์การแก้ปัญหา? .

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.