ฉันจะดีบัก emacs crash ได้อย่างไร


16

ฉันกำลังแก้จุดบกพร่องทำไม emacs เกิดปัญหาเมื่อใช้ฟังก์ชั่นจากแพคเกจ1 M-x report-emacs-bugจุดมุ่งหมายของการดำเนินการแก้ปัญหานี้คือการได้รับข้อมูลที่เป็นประโยชน์ในการส่งใช้

เพื่อรับความช่วยเหลือเกี่ยวกับวิธีการแก้ไขข้อบกพร่อง emacs ฉันได้ดูคู่มือ Emacs แล้ว - คู่มือการทำงานล้มเหลวและคู่มือ Emacs - หลังจากการขัดข้องแต่พวกเขาไม่ได้ช่วย

หลังจากที่ผิดพลาดด้วยตนเองหมายถึงemacs-buffer.gdbแต่ผมไม่มีความคิดวิธีการใช้งาน ในขณะที่ขอความช่วยเหลือจาก google ฉันเจอคำถามemacs.SE นี้และฉันจะคอมไพล์ emacs ใหม่โดยใช้-ggdb3แฟล็ก

ฉันไม่เคยมีประสบการณ์การใช้มาก่อนgdbดังนั้นฉันจึงลองใช้emacs-buffer.gbdไฟล์นี้ไม่สำเร็จ

นี่คือสิ่งที่ฉันพยายาม:

  • gdb -x /path/to/emacs-buffer.gdb
  • gdb -> file /path/to/emacs-buffer.gdb
  • gdb -> source /path/to/emacs-buffer.gdb
  • source /path/to/emacs-buffer.gdb

จากบันทึกด้านข้าง emacs ที่คอมไพล์ด้วย-ggdb3แฟล็กใช้เวลาโหลดนานกว่า 10 วินาที; ก่อนหน้านี้คือ 5-6 วินาทีขณะนี้ประมาณ 16-17 วินาที ฉันรู้ว่าวินาทีที่แน่นอนเพราะรหัสที่คำนวณว่าใน init ของฉัน คาดว่าจะเพิ่มขึ้นในเวลาเริ่มต้นนี้หรือไม่


เชิงอรรถ 1: emacs หยุดทำงานอย่างสม่ำเสมอเมื่อundo-treeพยายามกู้คืนประวัติการเลิกทำสำหรับไฟล์. org (ซึ่งฉันไม่สามารถแชร์แบบสาธารณะ) (setq undo-tree-auto-save-history t)ฉันมี ความผิดพลาดนี้เกิดขึ้นเฉพาะกับ git หลักของ emacs ไม่ใช่ใน emacs 24.5 ใน emacs 24.5 undo-treeโยนข้อผิดพลาดที่ระบุว่าไม่สามารถโหลดประวัติเลิกทำ (แม้จะผ่านไฟล์ประวัติเลิกทำอยู่) แต่อย่างน้อยเซสชัน emacs จะไม่ทำงานผิดพลาดในเวอร์ชันนั้น


2
ฉันใช้ Emacs มานานกว่าสองปีแล้วและยังไม่ได้คิดออกมาเลย: stackoverflow.com/q/20891431/2112489 พูดตามตรงแล้วมันค่อนข้างลึกลับและควรมีเธรดที่เชื่อถือได้ซึ่งสอนวิธีการทำ มัน.
ฏหมาย

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

ฉันไม่ต้องการจี้เธรดของคุณ แต่ฉันจะให้คำแนะนำ หากเธรดไม่ดึงดูดคำตอบที่เหมาะสมภายในระยะเวลาที่เหมาะสม (เช่นคุณตัดสินใจว่าหมายถึงอะไร) มันอาจคุ้มค่าที่จะทำให้เธรดนี้มีความเป็นทั่วไปมากขึ้น - เช่นเธรดที่มีสิทธิ์ในการใช้ gdb เพื่อดีบัก Emacs เกิดข้อขัดข้องสร้าง backtraces ที่มีความหมายซึ่งจะช่วยผู้เชี่ยวชาญในทีมพัฒนาของ Emacs เพื่อวินิจฉัย / แก้ไขปัญหาเมื่อได้รับรายงานข้อผิดพลาดที่มีข้อมูลดังกล่าว ผมเข้าใจปัญหาที่มีความสำคัญเพราะundue-treeปัญหาที่เกิดขึ้น แต่มันก็มีที่กว้างขึ้นที่อาจเกิดขึ้น
ฏหมาย

@lawlist นั่นคือสิ่งที่ฉันคาดหวังว่ากระทู้นี้จะเป็น ฉันไม่ได้คาดหวังundo-treeคำตอบที่เฉพาะเจาะจงเพราะฉันรู้ว่ามันจะยากสำหรับคนอื่นที่จะสร้างความผิดพลาดที่แน่นอน นอกจากนี้ฉันไม่สามารถแชร์ไฟล์องค์กรทั้งหมดซึ่งเป็นไฟล์เดียวที่ดูเหมือนว่าจะทำให้เกิดปัญหานี้ ดังนั้นฉันจึงใช้เฉพาะgdbแท็กกับคำถามนี้ ผมให้กลับมาเรื่องที่เพื่อให้คำตอบที่สามารถแนะนำผมวิธีการแก้ปัญหาความผิดพลาดใน emacs ดังนั้นทั่วไปที่ฉันสามารถยื่น emacs ประโยชน์รายงานข้อผิดพลาด
Kaushal Modi

@lawlist ฉันได้ปรับแต่งคำถามใหม่เพื่อให้ชัดเจนว่าไม่เฉพาะเจาะจงกับแพ็คเกจใด ๆ
Kaushal Modi

คำตอบ:


15

วิธีที่ง่ายที่สุดในการแก้ไขข้อผิดพลาดของ Emacs คือเริ่มต้น Emacs ที่อยู่ด้านล่างgdbจากนั้นทำทุกสิ่งที่ทำซ้ำ

สมมติว่าคุณกำลังสร้าง Emacs ของคุณจากแหล่งที่มาคุณควรผ่านCFLAGS="-O0 -g3"ไปยัง./configureสคริปต์ สิ่งนี้ทำให้คอมไพเลอร์ C ปิดการปรับให้เหมาะสม (ซึ่งอาจทำให้เกิดความสับสนในขณะที่การดีบัก) และเปิดใช้งานข้อมูลการดีบักสูงสุดในการปฏิบัติการ วิ่งmakeเพื่อสร้าง Emacs

จากนั้นเริ่มgdbจากภายในsrcไดเรกทอรีของต้นไม้ Emacs ของคุณ:

$ cd ~/my-emacs-tree/src
$ gdb ./emacs

ใน OSX คุณจะต้องผ่าน--with-nsไปยัง./configureสคริปต์และเริ่ม gdb บน Emacs ภายในแอปพลิเคชันที่สร้างขึ้น:

$ cd ~/my-emacs-tree
$ make install
$ cd src
$ gdb nextstep/Emacs.app/Contents/MacOS/Emacs

เหตุผลในการเริ่มต้นจากsrcไดเรกทอรีคือมี.gdbinitไฟล์ที่ตั้งค่าคำนิยามฟังก์ชัน GDB ที่เป็นประโยชน์สำหรับการดีบั๊ก Emacs หากไฟล์นั้นโหลดคุณควรเห็นสิ่งนี้เมื่อเริ่มต้นgdb:

DISPLAY = /private/tmp/com.apple.launchd.cNjhIdtUNd/org.macosforge.xquartz:0
TERM = xterm-256color
Breakpoint 1 at 0x1000ca444: file ../../src/emacs.c, line 353.
Breakpoint 2 at 0x1000e7e34: file ../../src/sysdep.c, line 926.

พิมพ์rเพื่อเริ่ม Emacs r --debug-initคุณสามารถส่งผ่านข้อโต้แย้งพิเศษในบรรทัดเดียวกันเช่น

จากนั้นพยายามทำให้ Emacs หยุดทำงาน หากเกิดปัญหาคุณควรเห็นข้อความเกี่ยวกับมันgdbและคุณจะถูกปล่อย(gdb)ให้พรอมต์อีกครั้ง หาก Emacs ไม่ทำงานผิดพลาด แต่ค้างคุณสามารถกดC-zที่เทอร์มินัลที่คุณกำลังวิ่งgdbกลับไปที่พรอมต์

เมื่อพร้อมต์ให้พิมพ์btเพื่อรับ backtrace เป็นโบนัสหาก.gdbinitไฟล์Emacs ถูกโหลดอย่างถูกต้องคุณจะเห็น Lisp backtrace หลัง C backtrace ทั้งสอง backtraces M-x report-emacs-bugเป็นสิ่งที่มีประโยชน์มากที่จะรวมอยู่ใน


มีข้อมูลมากขึ้นรวมถึงวิธีการตรวจสอบสถานะของตัวแปร ฯลฯ ในetc/DEBUGไฟล์ในทรี Emacs คุณสามารถเปิดได้โดยการพิมพ์C-h C-dภายใน Emacs หรือคุณสามารถอ่านแบบออนไลน์


ขอบคุณ ฉันจะหาเวลาวันนี้เพื่อลองวิธีแก้ปัญหาของคุณ ฉันยังคงสงสัยว่าemacs-buffer.gdbมันทำอะไรและใช้อย่างไร
Kaushal Modi

ดังที่ฉันเข้าใจแล้วนั่นคือการกู้คืนเนื้อหาของไฟล์ที่คุณแก้ไขโดยเฉพาะเมื่อ Emacs ขัดข้อง ในขณะที่ Emacs บันทึกทุก ๆ 30 วินาทีและกดปุ่ม 300 ครั้งทุกครั้งฉันจะบอกว่ามันมีประโยชน์ จำกัด
legoscia

1
แต่นั่นน่าจะช่วยกู้คืนบัฟเฟอร์ที่ไม่ใช่ไฟล์ได้ถูกต้องหรือไม่ ความคิดของฉันคือการใช้สิ่งนั้นเพื่อดูว่า * Messages * และ * Backtrace * มีอะไรมาก่อนความผิดพลาด
Kaushal Modi

อานั่นเป็นจุดที่ดี ฉันไม่เคยใช้มันดังนั้นฉันไม่แน่ใจว่าจะทำอย่างไร
legoscia

คุณรู้วิธีเรียกใช้ gdb บน emacsclient หรือไม่? ฉันไม่พบไบนารีsrc/นั้น ฉันพบในlib-src/ว่า gdb ./emacsclient -a '' -cแต่ตอนนี้ไม่ได้ทำงาน ดังนั้นฉันต้องการความช่วยเหลือเกี่ยวกับวิธีการส่งผ่านเหล่านั้น-aและ-cargs เพื่อ emacsclient แทนที่จะเป็น gdb
Kaushal Modi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.