मैं एक एमएसीएस क्रैश को कैसे डिबग करूं?


17

मैं डिबगिंग कर रहा हूं कि क्यों emacs एक पैकेज 1 से फ़ंक्शन का उपयोग करते समय क्रैश हो जाता है । इस डिबग प्रक्रिया का उद्देश्य उपयोग करने के लिए उपयोगी डेटा प्राप्त करना है M-x report-emacs-bug

Emacs क्रैश को डिबग करने के तरीके के बारे में मदद पाने के लिए, मैंने पहले ही Emacs Manual - Crashing और Emacs Manual - Crash के बाद देखा है , लेकिन उन्होंने कोई मदद नहीं की।

बाद एक दुर्घटना पुस्तिका को संदर्भित करता है emacs-buffer.gdb, लेकिन मैं पता नहीं है कि यह कैसे उपयोग करने के लिए है। मदद के लिए Google से पूछते समय, मैं इस emacs.SE प्रश्न पर आया , और मैंने -ggdb3झंडे का उपयोग करके emacs को फिर से जोड़ दिया

मेरे पास उपयोग करने का कोई पूर्व अनुभव नहीं है 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

एक साइड नोट पर, -ggdb3ध्वज के साथ संकलित emacs को लोड होने में लगभग 10 सेकंड अधिक समय लगता है; पहले यह 5-6 सेकंड था, अब लगभग 16-17 सेकंड। मैं एक कोड के कारण सटीक सेकंड जानता हूं जो मेरे init में गणना करता है। क्या स्टार्टअप के समय में यह वृद्धि अपेक्षित है?


Footnote 1: emacs लगातार क्रैश undo-treeकरता है जब किसी विशेष .org फ़ाइल के लिए पूर्ववत इतिहास को पुनर्स्थापित करने का प्रयास करता है (जिसे मैं सार्वजनिक रूप से साझा नहीं कर सकता)। मेरे पास है (setq undo-tree-auto-save-history t)यह क्रैश केवल emacs git मास्टर पर होता है, emacs 24.5 पर नहीं। Emacs 24.5 पर, undo-treeयह कहते हुए एक त्रुटि फेंकता है कि यह पूर्ववत इतिहास (पूर्ववत इतिहास फ़ाइल मौजूद होने के बावजूद) को लोड करने में असमर्थ है, लेकिन कम से कम emacs सत्र उस संस्करण पर क्रैश नहीं करता है।


2
मैं Emacs का उपयोग करने में दो साल से अधिक समय लगा रहा हूं और अभी भी इसे वास्तव में समझ नहीं पाया हूं: stackoverflow.com/q/20891431/2112489 ईमानदार होने के लिए, यह कुछ हद तक रहस्य है और एक आधिकारिक धागा होना चाहिए जो सिखाता है कि कैसे करना है यह।
कानूनविद

ठीक है, इस सवाल को देखने के मायने हैं, लेकिन कोई उभार नहीं है। यदि आपको मुझसे प्रश्न सुधारने की आवश्यकता है तो मुझे बताएं। अगर आपको लगता है कि सवाल एक अच्छा जवाब दे सकता है और ईमैक समुदाय के लिए मददगार हो सकता है, तो कृपया इसे बढ़ा-चढ़ाकर पेश करें, ताकि यह एक संभावित उत्तरदाता का ध्यान आकर्षित कर सके।
कौशल मोदी

मैं आपके धागे को हाईजैक नहीं करना चाहता, लेकिन मैं एक सुझाव दूंगा। यदि थ्रेड उचित समय के भीतर एक उपयुक्त उत्तर को आकर्षित नहीं करता है (यानी, आप इसका क्या मतलब है यह तय करते हैं), तो इस थ्रेड को अधिक सामान्य बनाने के लिए सार्थक हो सकता है - उदाहरण के लिए, कैसे gdb को डीबग करने के लिए Emacs का उपयोग करने पर आधिकारिक थ्रेड क्रैश, अर्थपूर्ण बैकट्रैक बनाते हैं जो Emacs डेवलपमेंट टीम के गुरुओं को उन सूचनाओं का निदान / निवारण करने में सहायता करेंगे जो बग-रिपोर्ट प्राप्त करते हैं, जिसमें उक्त जानकारी शामिल है। मैं समझता हूं कि समस्या के कारण मुद्दा महत्वपूर्ण undue-treeहै, लेकिन इसकी व्यापक संभावनाएं हैं
कानूनविद

@ सूची यह वही है जो मैं उम्मीद करता हूं कि यह धागा होगा। मैं एक undo-treeसटीक जवाब की उम्मीद नहीं करता था क्योंकि मुझे पता है कि किसी और के लिए उस सटीक दुर्घटना को फिर से बनाना मुश्किल होगा। इसके अलावा, मैं पूरे ओआरजी फ़ाइल को साझा नहीं कर सकता जो कि इस दुर्घटना का कारण लगता है। इसलिए मैंने gdbइस सवाल पर केवल टैग लगाया । मैंने वह बैक स्टोरी दी ताकि जवाब मुझे गाइड कर सकें कि कैसे एमएसीएस क्रैश को सामान्य रूप से डिबग किया जाए ताकि मैं एक उपयोगी एमएसीएस बग रिपोर्ट दर्ज कर सकूं
कौशल मोदी

@lawlist मैंने प्रश्न को फिर से परिभाषित किया है ताकि यह स्पष्ट हो कि यह किसी भी पैकेज के लिए विशिष्ट नहीं है।
कौशल मोदी

जवाबों:


15

Emacs क्रैश को डीबग करने का सबसे आसान तरीका Emacs को शुरू करना है gdb, और फिर वह जो भी कार्य करता है वह क्रैश को पुन: पेश करता है।

मान लें कि आप स्रोत से अपने Emacs का निर्माण कर रहे हैं, तो आप पास करना चाहिए CFLAGS="-O0 -g3"करने के लिए ./configureस्क्रिप्ट। यह सी कंपाइलर ऑप्टिमाइज़ेशन को बंद कर देता है (जो डिबगिंग करते समय चीजों को भ्रमित कर सकता है) और निष्पादन योग्य में अधिकतम डिबग जानकारी को सक्रिय करता है। makeEmacs बनाने के लिए रन करें।

फिर, अपने Emacs वृक्ष gdbकी srcनिर्देशिका के भीतर से शुरू करें:

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

पर OSX, आप पारित करने के लिए चाहता हूँ --with-nsकरने के लिए ./configureस्क्रिप्ट और बनाया आवेदन के अंदर Emacs पर gdb शुरू:

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

srcनिर्देशिका से शुरू करने का कारण यह है कि एक .gdbinitफ़ाइल है जो Emacs को डीबग करने के लिए उपयोगी GDB फ़ंक्शन परिभाषा सेट करती है। यदि वह फ़ाइल लोड की गई थी, तो आपको शुरू करते समय कुछ इस तरह से देखना चाहिए 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.

rEmacs शुरू करने के लिए टाइप करें। आप एक ही लाइन पर अतिरिक्त तर्क पारित कर सकते हैं, जैसे r --debug-init

फिर Emacs को क्रैश बनाने की कोशिश करें। यदि यह दुर्घटनाग्रस्त हो जाता है, तो आपको इसके बारे में एक नोट देखना चाहिए gdbऔर आपको (gdb)फिर से संकेत पर छोड़ दिया जाएगा । यदि Emacs क्रैश नहीं करता है, लेकिन जमा देता है, तो आप C-zउस टर्मिनल में जा सकते हैं जहां आप gdbशीघ्र वापस जाने के लिए दौड़ रहे हैं ।

एक बार प्रॉम्प्ट पर, btबैकट्रेस पाने के लिए टाइप करें। एक बोनस के रूप में, यदि Emacs .gdbinitफ़ाइल को सही तरीके से लोड किया गया था, तो आपको C बैकट्रेस के बाद एक लिस्प बैकट्रेस दिखाई देगा। दोनों backtraces में शामिल करने के लिए बहुत उपयोगी चीजें हैं M-x report-emacs-bug


etc/DEBUGEmacs के पेड़ में फ़ाइल में चर आदि की स्थिति की जांच करने सहित कई और जानकारी है । आप इसे C-h C-dEmacs के अंदर लिख कर खोल सकते हैं , या आप इसे ऑनलाइन पढ़ सकते हैं


धन्यवाद। आपके समाधान का प्रयास करने के लिए मुझे आज समय मिलेगा। मैं अभी भी उत्सुक हूं कि emacs-buffer.gdbइसका क्या और कैसे उपयोग करना है।
कौशल मोदी

जैसा कि मैंने इसे समझा, यह विशेष रूप से उस फ़ाइल की सामग्री को पुनर्प्राप्त करने के लिए है जिसे आप संपादित कर रहे थे जब Emacs दुर्घटनाग्रस्त हो गया था। Emacs के रूप में प्रत्येक 30 सेकंड और हर 300 कुंजी प्रेस को स्वत: सहेजता है, मैं कहता हूं कि इसका सीमित उपयोग है।
लेगोस्कोपिया

1
लेकिन यह भी गैर-फ़ाइल बफ़र्स को पुनर्प्राप्त करने में मदद करनी चाहिए, क्या यह सही है? मेरा विचार यह उपयोग करना था कि दुर्घटना के ठीक पहले * संदेश * और * बैकट्रेस * क्या देखें।
कौशल मोदी

आह, यह एक अच्छी बात है। मैंने इसे कभी खुद इस्तेमाल नहीं किया है, इसलिए मुझे यकीन नहीं है कि यह कैसे करना है।
लेगोस्किया

क्या आप जानते हैं कि emacsclient पर gdb कैसे चलाया जाता है? मैं में है कि द्विआधारी नहीं मिल सकता है src/। मैं इसे में पाया, lib-src/लेकिन यह काम नहीं किया gdb ./emacsclient -a '' -c। तो मैं कैसे gdb के बजाय उन लोगों को पारित करने के लिए -aऔर -cखाली करने के लिए args पर मदद की जरूरत है ।
कौशल मोदी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.