การดีบัก Emacs ที่ถูกตรึง


48

ฉันใช้หมิวสำหรับอีเมลของฉัน ฉันต้องใช้ TLS กับผู้ให้บริการอีเมลของฉันสำหรับ SMTP อย่างไรก็ตามเมื่อฉันพยายามที่จะเรียกมันว่า Emacs ค้าง

ฉันต้องการใช้โอกาสนี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับแพ็คเกจ Emacs ฉันจะแก้ไขข้อบกพร่องนี้ได้อย่างไร มีการดีบักเกอร์ในตัวบางอย่างเหมือนใน Common LISP ใช่หรือไม่ ฉันสามารถใช้การบันทึกได้หรือไม่


3
คุณจะ "เรียกใช้สิ่งนั้น" ได้อย่างไร หากเป็นโดยใช้คำสั่ง Emacs ที่กำหนดไว้ใน Lisp คุณสามารถ (1) โหลดซอร์สโค้ดที่กำหนดคำสั่ง (2) ใช้M-x debug-on-entry THE-COMMANDจากนั้นผ่านขั้นตอนการดีบักเกอร์โดยใช้d(หรือบางครั้งcเพื่อข้ามผ่านบางขั้นตอน) เปิดซอร์สโค้ดในเฟรมอื่นเพื่อให้คุณสามารถติดตามสิ่งที่ดีบักเกอร์ทำงานอยู่ รายงานสิ่งที่คุณเห็นนี่หรือถ้าคุณคิดว่ามันแสดงให้เห็นข้อผิดพลาด Emacs M-x report-emacs-bugใช้
Drew

คำตอบ:


44

ก่อนที่จะใช้gdbถ้าคุณใช้ระบบปฏิบัติการ Unix-y คุณสามารถลองส่งSIGUSR2ไปยังกระบวนการ Emacs เช่นเอกสารในDEBUGไฟล์ที่กล่าวถึงในคำตอบอื่น ๆ

$ kill -SIGUSR2 <emacs_pid_goes_here>

สิ่งนี้จะทำให้ Emacs พยายามที่จะแยกลูปปัจจุบันออกเป็นดีบักเกอร์ Lisp

หรือใช้สายการบินเดียวนี้โดยไม่ต้องพิมพ์ emacs pid ด้วยตนเอง:

$ ps aux | grep -ie emacs | grep -v grep | awk '{print $2}' | xargs kill -SIGUSR2

หรือถ้าkillallมี:

$ killall -USR2 emacs

1
ต้องทำสองครั้ง (ดีฉันอาจรอมากกว่า 1 วินาทีก่อนลองใหม่อีกครั้ง :-) อย่างไรก็ตามมันระบุปัญหา (การประมวลผลการล็อคแบบอักษรช้าเกินไปสำหรับสายยาว)
Stéphane Gourichon

font-lock นั้นเป็นที่รู้จักกันว่า hang Emacs - หากตัวเรียกใช้ตัวจับคู่ แต่ไม่ย้ายจุดไปข้างหน้า
Lindydancer

ว้าวนั่นช่างน่าอัศจรรย์ ยังไม่แน่ใจว่าเกิดอะไรขึ้นกับปัญหาของฉัน แต่เคล็ดลับนั้นเป็นผู้ช่วยชีวิตขอบคุณ!
Matt

3
ในระบบของฉัน oneliner สามารถทำให้ 'emalls -USR2 emacs' ง่ายขึ้น (หลีกเลี่ยงหากคุณมีกระบวนการของ Emacs หลายตัว)
YoungFrog

1
แนะนำ htop ( en.wikipedia.org/wiki/Htop ) สำหรับสิ่งนี้ /เพื่อค้นหาemacsและkส่งสัญญาณ การตรวจสอบกิจกรรมบน Mac ยังสามารถทำได้ (จากเมนู: ดู | ส่งสัญญาณไปยังกระบวนการ)
Lassi

36

หากการแช่แข็งหายไปเมื่อคุณเข้าชมC-gคุณสามารถใช้ดีบักเกอร์ในตัวได้ พิมพ์M-x toggle-debug-on-quitก่อนที่จะส่งข้อความกดปุ่มC-gเมื่อมันค้างและตรวจสอบ*Backtrace*บัฟเฟอร์ที่เกิดขึ้น

ถ้าC-gไม่ช่วยแล้วแช่แข็งอาจจะเกิดขึ้นในรหัส C gdbและคุณจะต้องใช้ดีบักภายนอกเช่น กดC-h C-dเพื่อดูDEBUGไฟล์ที่ให้คำแนะนำเกี่ยวกับวิธีการทำเช่นนั้น (คุณสามารถอ่านไฟล์ DEBUG ในเว็บอินเตอร์เฟสของที่เก็บ Emacsได้) คำตอบนี้มีรายละเอียดเพิ่มเติมเกี่ยวกับวิธีใช้gdbกับ Emacs


คุณอาจจะต้องตีหลายครั้ง:C-g C-g C-g C-g
Drew

@ ดึงฉันยังสังเกตเห็นว่าการกดปุ่มหลายครั้งเป็นสิ่งที่จำเป็น คุณรู้ไหมว่าทำไม?
Wilfred Hughes

2
ใช่. ดูEmacs Quittingคู่มือโหนด ฉันพบได้อย่างไร C-h r iแล้วพิมพ์ "Cg" RETและตี
Drew
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.