การดีบั๊กของ Emacs ที่ล้มเหลว


9

แม้ว่า Emacs (24.3.93.1) จะทำงานได้ดีหากเปิดตัวจาก Finder หากรุ่นเทอร์มินัลเปิดตัว:

/Applications/Emacs.app/Contents/MacOS/Emacs -nw

Emacs ล่มด้วย:

Fatal error 11: Segmentation fault[1] 51512 abort /Applications/Emacs.app/Contents/MacOS/Emacs -nw.

ดูเหมือนว่าปัญหาเกิดจากบรรทัดเดียวใน init.el

(set-face-attribute 'default nil :font "Menlo-16")

หากบรรทัดนั้นถูกคอมเม้นต์แล้วเวอร์ชันเทอร์มินัลของ Emacs ก็จะเริ่มต้นเช่นกัน

เพื่อระบุสาเหตุของความผิดพลาดนั้นทำให้ฉันใช้เวลาหลายชั่วโมง (ลดการเริ่มต้นของฉันครึ่งต่อครึ่ง)

ฉันทราบว่าในกรณีใด ๆ Emacs จะรับช่วงตัวอักษรและขนาดตัวอักษรใด ๆ ก็ตามที่ระบุไว้ในแอปเทอร์มินัล (โดยทั่วไปแล้วบรรทัดนั้นไม่มีความหมายใน cli)

  1. โดยทั่วไปแล้วจะมีวิธีที่ดีกว่าในการดีบัก Emacs ที่ล้มเหลวหรือไม่ บางทีใช้ cli debugger บางชนิดที่จะพิมพ์ข้อความอธิบายเพิ่มเติมหรือไม่
  2. เหตุใดบรรทัดนั้นจึงส่งผลกระทบกับ Emacs ผ่านทาง CLI แต่ไม่เปิดตัวจาก Finder

มันเปิดตัวจริง ๆ จาก CLI หรือไม่? หรือเรียกใช้เวอร์ชันเทอร์มินัลที่ทำให้เกิดปัญหา ลองใส่ข้อผิดพลาดบางอย่างเกี่ยวกับ set-face-attribute? (condition-case err (set-face-attribute ... ) (ข้อผิดพลาด (ข้อความ "อ๊ะ!")))
nic ferrier

3
ยื่นรายงานข้อผิดพลาด Emacs ไม่ควรผิดพลาดเนื่องจากรหัสเสียงกระเพื่อม แต่นี่อาจเป็นปัญหากับงานสร้างเฉพาะที่คุณใช้อยู่มันเป็นรุ่นวางจำหน่ายอย่างเป็นทางการหรือไม่?
Malabarba

@ nic-ferrier: ตอนนี้ฉันมีเพียงหนึ่งบรรทัดใน init.el (condition-case err (set-face-attribute 'default nil :font "Menlo-16") (error (message "Whoops!")))ฉันยังคงมีข้อผิดพลาดเดียวกันกับข้อความแสดงข้อผิดพลาดเดียวกัน ไม่มีข้อความที่มาจากต้นกำเนิดเพิ่มเติม
gsl

@ malabarba: ฉันได้ลองด้วยGNU Emacs 24.3.1 (x86_64-apple-darwin, NS apple-appkit-1038.36) of 2013-03-13 on bob.porkrind.orgจากemacsformacosx.comแล้วและ Emacs ก็ไม่ผิดพลาด ดังนั้นมันจะต้องเป็นข้อบกพร่องในรุ่นที่ใหม่กว่า ฉันจะยื่นรายงานข้อผิดพลาด
gsl

1
ในฐานะที่เป็น @Malabarba ระบุยื่นรายงานข้อผิดพลาดM-x report-emacs-bug (ทันที): นักพัฒนาของ Emacs จะนำคุณผ่านสิ่งที่คุณสามารถทำได้เพื่อช่วยแก้ไขปัญหา
ดึง

คำตอบ:


6

เพื่อช่วยให้คุณติดตามได้ในครั้งต่อไป

เรื่องนี้เกิดขึ้นกับฉันก่อน มีสถานการณ์ที่ string-to-intEmacs พังและฉันใช้เวลาหลายชั่วโมงเพื่อระบุเช่นกัน
ขออภัยฉันไม่สามารถให้คำตอบที่ดีกว่าได้ แต่ Emacs ล่มเกิดขึ้นลึกลงไปในรหัส C และไม่มีเครื่องมือในตัวที่สามารถติดตามปัญหาดังกล่าวได้

ฉันคิดว่าการแก้จุดบกพร่องด้วยgdbเป็นไปได้ gdbแต่ประสิทธิภาพของมันจะขึ้นอยู่กับความสามารถของคุณด้วย

สิ่งที่คุณต้องทำคือ

ยื่นรายงานข้อผิดพลาด

รหัส elisp บริสุทธิ์ (ไม่คอมไพล์ไบต์) ไม่ควรที่จะผิดพลาด Emacs มันอาจทำให้เกิดการแฮงค์ (เนื่องจากการวนซ้ำไม่สิ้นสุด) และอาจทำให้ Emacs หน่วยความจำไม่เพียงพอ แต่นอกเหนือจากนั้นความผิดพลาดใด ๆ ที่เป็นข้อผิดพลาด

M-x report-emacs-bug

เพียงแค่แสดงตัวอย่างการทำงานที่น้อยที่สุดที่คุณได้รับพร้อมกับคำอธิบายของการสร้างและระบบของคุณควรจะช่วยได้มากพอสำหรับนักพัฒนาที่ใจดี


2
การใช้ gdb จะเป็นวิธีเดียว เราสามารถเพิ่มสิ่งของลงใน Emacs เพื่อห่อทุกการโทร C ในบางสิ่งที่จะจับได้ด้วยตัวเอง แต่นั่นจะเป็นค่าใช้จ่ายตลอดเวลา Emacs ไม่ควรจะผิดพลาดถ้าเป็นเช่นนั้นเราควรจัดการข้อผิดพลาดนั้นโดยเฉพาะเพื่อที่จะไม่ได้อีกต่อไป ดังนั้นถ้ามันพังให้ยื่นข้อบกพร่อง ใช้ gdb โดยทั้งหมดเพื่อหาข้อผิดพลาดอย่างแน่นอน
nic ferrier

4

เป็นการอ้างอิงถึงการดีบักด้วย gdb คุณจะต้องใช้ src / temacs จากโครงสร้างการสร้าง นี่คือ Emacs ที่ไม่มี elisp ที่ทิ้งไว้ล่วงหน้าซึ่งสร้างความสับสนให้แก่ดีบักเกอร์

gdb --args src/temacs -nw

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