วิธีการดีบักข้อผิดพลาดในรักษาการณ์และระหว่างล็อคแบบอักษร


10

เมื่อมีข้อผิดพลาดเกิดขึ้นในกระบวนการยามหรือในระหว่างการล็อคตัวอักษรแล้ว Emacs จะไม่แสดง backtrace แม้ว่าจะdebug-on-errorเปิดใช้งานก่อนหน้านี้

ฉันเข้าใจว่าทำไมข้อผิดพลาดเหล่านี้ถึงได้ข้อผิดพลาดเดียวกันอาจถูกเรียกอีกครั้งในขณะที่พยายามนำเสนอ backtrace อย่างไรก็ตามเมื่อฉันต้องการแก้ไขข้อผิดพลาดจริง ๆ แล้วมันไม่ได้มีประโยชน์มาก ฉันค่อนข้างจะเสี่ยงที่ Emacs จะไม่ตอบสนองมากกว่าต้องทำงานจากสิ่งนี้:

error in process sentinel: Wrong type argument: stringp, nil

หลังจากทั้งหมดฉันสามารถเริ่มอินสแตนซ์ที่สองถ้าเริ่มแรกจะบ้า บริบทเล็ก ๆ น้อย ๆ จะช่วยได้มากขึ้นเมื่อมีหลายสถานที่ซึ่งข้อผิดพลาดดังกล่าวอาจเกิดขึ้นในยามรักษาการณ์

ดังนั้นฉันจะบังคับให้ Emacs แสดง backtrace ได้อย่างไรในกรณีที่debug-on-errorไม่มีผลกระทบ?


1
ฉันเคยเห็นemacs.stackexchange.com/questions/3552/…แต่คิดว่าควรมีคำถามเกี่ยวกับเรื่องนี้โดยทั่วไปไม่ใช่แค่กรณีเดียวเท่านั้น นอกจากนี้ฉันหวังว่า "use printf" ไม่ใช่คำตอบเดียวเพราะนั่นคือสิ่งที่ฉันเคยใช้ในอดีตและไม่พอใจโดยเฉพาะถ้าข้อผิดพลาดคือ "การอ้างอิงใบหน้าที่ไม่ถูกต้อง: some-face-ซึ่ง -i- อย่างรู้ - มีอยู่ "ซึ่งสามารถเรียกใช้งานได้โดยทุกแพ็คเกจที่ฉันติดตั้ง
Tarsius

URL ชี้ไปที่คำถามนี้และค่อนข้างสับสนในความคิดเห็นของคุณมันเป็นความตั้งใจหรือมีข้อผิดพลาดในนามของคุณ?
wasamasa

นั่นคือปัญหาที่ฉันหมายถึง: ttp: //emacs.stackexchange.com/questions/1045/how-to-debug-startup-problem-if-debug-init-has-no-effect
tarsius

ลิงก์ tarsius ตั้งใจ: emacs.stackexchange.com/questions/1045/… ug ug-init- have -no-effect
dcorking

คำตอบ:


10

สำหรับรักษาการณ์ของกระบวนการฉันไม่คิดว่ามีเหตุผลที่ดี IOW M-x report-emacs-bugฉันคิดว่ามันเป็นเพียงแค่คุณสมบัติที่ขาดหายไปดังนั้นผมจึงขอแนะนำให้คุณ

สำหรับ font-lock ปัญหานั้นยุ่งยากมากขึ้นเพราะสิ่งที่เกิดขึ้นจริงคือข้อผิดพลาดเกิดขึ้นระหว่าง jit-lock นั่นคือระหว่างการแสดงซ้ำและเราไม่สามารถป้อน debugger ได้ในขณะนั้น (IIRC ณ จุดหนึ่ง Gerd พยายามทำ มันใช้งานได้ แต่ยังมีปัญหาร้ายแรงอยู่) ดังนั้นคุณสามารถดีบักได้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้:

  • M-x jit-lock-debug-mode ซึ่งเปลี่ยน jit-lock ให้ทำงานทันทีหลังจากเล่นซ้ำเพื่อให้เราสามารถเข้าสู่การดีบั๊ก
  • M-: (setq font-lock-support-mode nil) RETจากนั้นปิดใช้งาน + เปิดใช้งานแบบอักษรล็อคอีกครั้ง วิธีนี้ฟอนต์ล็อคไม่ได้ใช้ jit-lock อีกต่อไปดังนั้นจึงรันในระหว่างคำสั่งของผู้ใช้มากกว่าในช่วงการแสดงซ้ำครั้งต่อไป

ที่จริงdebug-on-errorดูเหมือนว่าจะทำงานได้ดีกับกระบวนการรักษาการณ์
สเตฟาน

@tarsius - โปรดโพสต์ลิงก์ไปยังปัญหา debbugs ของคุณ
dcorking

คำขอคุณลักษณะของ tarsius คือ19432ซึ่งถูกแท็กว่าไม่สามารถทำซ้ำได้ สเตฟาน Monnier โพสต์วิธีแก้ปัญหามีที่ใช้ มากกว่า--eval --debug-initวิธีแก้ปัญหาของเขาก็ไม่ได้ช่วยให้ฉัน.emacs.d
ตกต่ำ

1
@dcorking: ไม่ในข้อผิดพลาด # 19432 ฉันไม่ได้โพสต์ "การแก้ปัญหา" แต่ความพยายามล้มเหลวในการทำซ้ำข้อผิดพลาดของเขา ทำไมคุณไม่ส่งสูตรทำซ้ำปัญหาของคุณ?
สเตฟาน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.