संरक्षित स्मृति से पहले उन्होंने विभाजन के दोषों को कैसे मिटाया?


20

अब, जब मैं सी में पॉइंटर्स के साथ एक प्रोग्रामिंग गलती करता हूं, तो मुझे एक अच्छा विभाजन दोष मिलता है, मेरा प्रोग्राम क्रैश हो जाता है और डिबगर मुझे यह भी बता सकता है कि यह कहां गलत हुआ।

उन्होंने उस समय कैसे किया जब स्मृति संरक्षण उपलब्ध नहीं था? जब वह गलती करता है तो मैं एक डॉस प्रोग्रामर को पूरी तरह से दूर कर देता हूं और पूरे ओएस को क्रैश कर देता हूं। वर्चुअलाइजेशन उपलब्ध नहीं था, इसलिए वह जो कुछ भी कर सकता था वह पुनः आरंभ और पुनः प्रयास कर रहा था। क्या वाकई ऐसा हुआ था?


4
हाँ, यह है कि यह कैसे चला गया। एक यादृच्छिक कंप्यूटर रिबूट हुआ, और अक्सर हुआ। मेमोरी प्रोटेक्शन एक अद्भुत चीज है :)
रॉकलैन

7
जब आपके पास मेमोरी संरक्षित नहीं होती है, तो विभाजन दोष जैसी कोई चीज नहीं होती है। बेशक, भले ही आपके पास संरक्षित मेमोरी हो, फिर भी आप अपनी खुद की जगह को रोक सकते हैं; ओएस सिर्फ इसके बारे में परवाह नहीं करता है।
ब्लरफ्ल

3
अब भी कई सूचक गलतियाँ एक अच्छा segfault का कारण नहीं है।
कोडइन्चोएज

1
डॉस के समय, संरक्षित मेमोरी पहले से ही अन्य ओएस में मौजूद थी।
मौविसील

जवाबों:


36

जब वह गलती करता है तो मैं एक डॉस प्रोग्रामर को पूरी तरह से दूर कर देता हूं और पूरे ओएस को क्रैश कर देता हूं।

हाँ, यह बहुत सुंदर बात है। मेमोरी मैप्स वाले अधिकांश सिस्टम पर, स्थान 0 को अमान्य चिह्नित किया गया था, ताकि अशक्त बिंदुओं का आसानी से पता लगाया जा सके, क्योंकि यह सबसे आम मामला था। लेकिन बहुत सारे अन्य मामले थे, और उन्होंने तबाही मचाई।

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


3
वास्तव में, मुझे उम्मीद थी कि "पुराने गीज़र" मेरे सवाल का जवाब देंगे। कुछ भी नहीं पहले हाथ अनुभव धड़कता है। धन्यवाद।
बार्ट फ्राइडरिचर्स

6
कोड लिखने की कोशिश करें जब हार्डवेयर हर रात 02:00 से 06:00 तक डिबगिंग के लिए उपलब्ध हो, यह मानते हुए कि आपके सहयोगी ने इसे अपने डिबग सत्र के लिए आरक्षित नहीं किया था।
MSalters

@ दलाल वास्तव में! मेरी पहली नौकरी में, हम रविवार को 0700 से 1900 तक स्लॉट बुक कर सकते थे - एक असली इलाज, lemme आपको बताए :-)
रॉस पैटरसन

2
मुझे याद है कि विश्वविद्यालय से घर आने वाले कागज़ पर अपना पहला कार्यक्रम लिखना । अगले दिन जब मैं इसे पंच कर सकता था और इसे चला सकता था, यह निर्दोष था ;-)
जन डॉगगेन

1
@JanDoggen, मेरे लिए भी यही। जब आपके पास केवल एक कोशिश होती है तो आप कोशिश करते हैं कि वास्तव में गिनती करें।
nalply

23

मेरे दिन में वापस, हमारे पास स्मृति सुरक्षा और सभी स्नैज़ी व्यवसाय नहीं थे! हमने यह निर्धारित करने के लिए कि हम कार्यक्रम में कहां थे, प्रिंटआउट का उपयोग किया, और हमें यह पसंद आया !

हालांकि सभी गंभीरता में, इसका मतलब आमतौर पर हम केवल अधिक सावधान थे। जहां मॉलॉक कहा जाता है, वहाँ कार्यक्रम में कहीं और एक मुक्त होना था, और इस तरह की जाँच कठोर थी क्योंकि एक समस्या के मामले में, जैसा कि आपने स्पष्ट रूप से बताया है, विभाजन दोष सहायक त्रुटियां नहीं हैं।

इस तरह की त्रुटियों के मामले में, आप जो सबसे अच्छा कर सकते हैं वह यह समझने की कोशिश करें कि जब इस तरह के विभाजन दोष होते हैं (प्रिंटफ का उपयोग करके) और, कोड को देखते हुए, यह निर्धारित करें कि उस बिंदु पर मेमोरी तक पहुंच वैध क्यों नहीं थी और वहां से पीछे की ओर काम करें।

संक्षेप में, आज भी यही बात होती है, सिवाय इसके कि हम डिबगर्स का उपयोग यह निर्धारित करने के लिए करते हैं कि त्रुटियां कब होती हैं, लेकिन आपको अभी भी यह समझना होगा कि ऐसा क्यों हुआ, और यह हमेशा उस रेखा को खोजने के रूप में सरल नहीं है जिसमें त्रुटि हुई थी। त्रुटियां एक श्रृंखला प्रतिक्रिया की तरह त्रुटियों का कारण बनती हैं, और यदि आप उन दिनों में सी प्रोग्रामर थे, तो आपने अपना 20% समय कोडिंग में बिताया था और बाकी समय अपने बालों को फिक्सिंग कीड़े खींचते थे।


2
मल्लों को मुक्त करो!
क्रिस

1
हर बार एक बार, यहां तक ​​कि आज भी, यहां तक ​​कि कॉल स्टैक और वेरिएबल स्टेट यह निर्धारित करने के लिए पूरी तरह से बेकार हैं कि क्या बिल्ली गलत हो गई और इसे कैसे ठीक किया जाए। यही कारण है कि विशेष रूप से यदि आपके पास बड़ी संख्या में संभावित राज्यों के साथ जटिल सॉफ़्टवेयर हैं, जिनमें से कुछ अन्योन्याश्रित हैं और कुछ पारस्परिक रूप से अनन्य हैं। एक भी आवारा लेखन कहीं भी और गारंटीकृत पूर्व शर्त के लिए एक लोप किए गए दावे आपको वहीं ला सकता है।
बजे एक CVn

1
@ माइकलकॉर्जलिंग, मुझे लगता है कि कार्यक्रमों में त्रुटियों की खोज करने वाली चिंताओं के लिए, हमने केवल उन चीजों के लिए प्रगति की है जो त्रुटि ट्रिगर को ढूंढ रही हैं, लेकिन हम अभी भी इन त्रुटियों के कारण को उजागर करने के लिए मीलों तक गए हैं। दावे मुझे निश्चित रूप से समझदार रखने में मदद करते हैं। :)
नील

6

कुंआ ..

एक segfault एक बहुत अच्छा संकेतक है कि कुछ गलत है लेकिन आपको अभी भी मूल कारण ढूंढना है। इसलिए यदि आप सवाल पूछते हैं कि आप इसका मूल कारण कैसे खोजते हैं तो इसका उत्तर आज की तुलना में बहुत अलग नहीं है। बेशक भाषाओं और उपकरणों के साथ काम करना आसान हो गया, लेकिन सामान्य टेकटिक समान है:

  • लॉगिंग उस क्षेत्र को खोजने में मदद करता है जहां आपकी समस्या है। बाइनरी सर्च प्रिंटफ इसका एक रूप है।
  • डिबगिंग, स्टेप बाय स्टेप, ब्रेक पॉइंट और वॉच
  • बेहतर समझ प्राप्त करने के लिए रीफैक्टरिंग
  • कोड को घूरना
  • मेमोरी / कोर डंप देखें
  • इसे अलग-अलग डेटा के साथ खिलाना
  • इसे अन्य लोगों को दिखा रहा है
  • संकेत के बिना एक भाषा पर स्विच करें (और समस्याओं का एक नया सेट) ...

अधिक सार स्तर पर आपके पास तीन दृष्टिकोण हैं: 1. कोड के साथ काम करें 2. प्रोग्राम को देखें जबकि यह चलता है। 3. परिणाम देखने के बाद बेवकूफ बना दिया

btw एक पॉइंटर त्रुटि segfault बनाने के लिए नहीं है।

एक Amiga प्रोग्रामर के रूप में मैंने इसका बहुत उपयोग किया। और हाँ फिर से शुरू जहाँ आम प्रथा है।


4

IBM 360 पर, फोरट्रान बैच की नौकरियों को चलाने के लिए, हम हेक्स कोर डंप प्राप्त करते थे। ऐसा डंप पंखे के गुना हरे और सफेद प्रिंटर के कागज के एक इंच से अधिक मोटा हो सकता है। यह बताएगा कि रजिस्टर क्या थे, और वहां से हम यह पता लगा सकते हैं कि कार्यक्रम क्या कर रहा था। हम प्रत्येक सबरूटीन का पता लगा सकते हैं और यह पता लगा सकते हैं कि उसने अपना रिटर्न पता कहाँ संग्रहीत किया है, इसलिए हम संदर्भ देख सकते हैं। यह कार्यक्रम की एक असेंबलर लिस्टिंग के लिए मदद करेगा।


2

एक बार मैं एक प्रसिद्ध विंडोज 3.1 प्रस्तुति सॉफ्टवेयर पर बगफिक्सिंग पर काम कर रहा था।

मेरे पास एक बग था, जो तब हुआ, जब ब्लू स्क्रीन ऑफ डेथ हुई।

बग केवल तब हुआ जब एक निश्चित लूप को 1000 से अधिक बार निष्पादित किया गया था। मैंने डिबगर की उन्नत सुविधाओं का उपयोग 1000 बार ब्रेक प्वाइंट पास करने के लिए किया और फिर मैंने सावधानी से कार्यक्रम के माध्यम से कदम रखा। हर बार मैं बहुत दूर चला गया या एक फ़ंक्शन कॉल पर छोड़ दिया, जिसमें बग विंडोज ब्लू स्क्रीन थी।

अंत में, कई दिनों के काम के बाद, मैंने इसे एक फंक्शन तक सीमित कर दिया, जो मेमोरी से बाहर चल रहा था और एक त्रुटि संदेश प्रदर्शित करने के बजाय, त्रुटि संदेश को बफर में जोड़ दिया। प्रत्येक बाद की पुनरावृत्ति के साथ यह अधिक मेमोरी को ट्रैश कर देता है जब तक कि कुछ महत्वपूर्ण नहीं लिखा गया था और विंडोज को ट्रैश किया गया था।

डिबगिंग कौशल और दृढ़ता समाधान था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.