2010-08-20 12 views
24

मैं hg bisect पढ़ रहा हूं और यह जानना दिलचस्प है कि किस संशोधन ने एक बग पेश किया है, लेकिन मैं जानना चाहता हूं कि लोग इस जानकारी का उपयोग किसके लिए करते हैं। एकमात्र चीज जिसे मैं सोच सकता हूं, यह संकुचित करने की कोशिश कर रहा है कि कौन सी तिथियों को डेटा फिक्स की आवश्यकता हो सकती है यदि यह एक बग है जिसके परिणामस्वरूप अमान्य डेटा का कुछ रूप होता है।Mercurial bisect के लिए क्या अच्छा है?

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

उत्तर

4

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

+0

एक संशोधन का परीक्षण करने के लिए एक स्क्रिप्ट लिखने में सक्षम होने के लिए, मुझे यह पता लगाना होगा कि बग कहां है और इसका परीक्षण करें। जहां तक ​​तारीखें हैं, मैं बता सकता हूं कि मैंने 7/1 पर कुछ किया है और इसे 7/15 को हमारे उत्पादन माहौल में जारी किया गया था और मुझे डेटाफिक्स करना है, मुझे पता है कि मुझे केवल 7 से अधिक डेटा के साथ काम करना है/15। वह सारी जानकारी एनोटेशन में उपलब्ध है, इसलिए मुझे यकीन नहीं है कि बिसेक्ट कैसे मदद करता है। –

+0

यह आपके जैसा ही है, आपको यह पता लगाना होगा कि बग कहां है। बिसेक्ट उस के साथ मदद करता है। यदि आप जानते हैं कि 7/15 से पहले कुछ भी अच्छा है तो आपको अभी भी उस बदलाव को ढूंढना होगा जिसने 7/15 के बाद बग का कारण बना दिया है। यह बिल्कुल ठीक है कि किसके लिए अच्छा है। आप इसे 7/15 पर परिवर्तन देते हैं जो आपको पता है कि अच्छा है और वह सिर जो विफल रहता है और यह आपको अपराधी को खोजने के लिए जल्दी से बाइनरी खोज करता है। –

1

यह बग के लक्षण से स्पष्ट नहीं हो सकता है कि इसका कारण क्या है - उदा। आपको एक बहुत ही सामान्य त्रुटि या अस्पष्ट त्रुटि संदेश मिल सकता है। hg bisect का उपयोग करने से आपको कारण मिल सकता है।

0

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

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

70

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

यह इस तरह काम करता है। आप द्विविभाजित राज्य को रीसेट और बुरे के रूप में वर्तमान संशोधन चिह्नित करके शुरू के बाद से यह बग शामिल हैं:

$ hg bisect --reset 
$ hg bisect --bad 

फिर आप एक बिंदु है जहां आप बग आशा को इतिहास में वापस कूद मौजूद नहीं है:

$ hg update -r -100 
89 files updated, 0 files merged, 30 files removed, 0 files unresolved 

आप इस संशोधन पर अपने सॉफ्टवेयर का परीक्षण करने के लिए है और यदि बग मौजूद नहीं है, तो आप इसे चिह्नित कर सकते हैं के रूप में अच्छा:

$ hg bisect --good 
Testing changeset 11964:79bd860b8eb7 (81 changesets remaining, ~6 tests) 
36 files updated, 0 files merged, 22 files removed, 0 files unresolved 

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

$ hg bisect --good 
Testing changeset 11985:81edef14922e (41 changesets remaining, ~5 tests) 
23 files updated, 0 files merged, 26 files removed, 0 files unresolved 

मैं इस तरह जारी रखने के लिए जब तक मर्क्युरियल एक भी changeset के लिए खोज को संकुचित होता है:

$ hg bisect --bad 
Testing changeset 11975:21884b433c51 (20 changesets remaining, ~4 tests) 
18 files updated, 0 files merged, 8 files removed, 0 files unresolved 
$ hg bisect --good 
Testing changeset 11980:c443e95d295b (10 changesets remaining, ~3 tests) 
5 files updated, 0 files merged, 10 files removed, 0 files unresolved 
$ hg bisect --good 
Testing changeset 11982:56d9b73487ff (5 changesets remaining, ~2 tests) 
2 files updated, 0 files merged, 4 files removed, 0 files unresolved 
$ hg bisect --bad 
Testing changeset 11981:518b90d66fad (2 changesets remaining, ~1 tests) 
2 files updated, 0 files merged, 1 files removed, 0 files unresolved 
$ hg bisect --bad 
The first bad revision is: 
changeset: 11981:518b90d66fad 
user:  Pradeepkumar Gayam <[email protected]> 
date:  Wed Aug 18 05:55:56 2010 +0530 
summary:  tests: unify test-merge8 

आप अभी भी अपने आप डीबगिंग, लेकिन hg bisect का उपयोग कर ऐसा करने के लिए जो changesets का ट्रैक रखने से बचाता है आप पहले से ही परीक्षण कर चुके हैं और जिन्हें आपको अभी भी परीक्षण करने की आवश्यकता है। आप इसके लिए पोस्ट-नोट्स का एक समूह का उपयोग कर सकते हैं, लेकिन Mercurial इसे करने के लिए यह बहुत अच्छा है। यह विशेष रूप से सच है जब परिवर्तन ग्राफ एक विलय की वजह से गैर-रैखिक है।

तो सभी में, hg bisect आपको लॉगरिदमिक समय में एक दोषपूर्ण परिवर्तन की खोज करने में मदद करता है, बिना किसी खोज के जहां आप खोज में हैं।

+3

इसके अतिरिक्त, यदि आप एक बग को एक बदलाव में संकीर्ण कर सकते हैं, तो कई बार आप आसानी से देख सकते हैं कि बग कहां से पेश किया गया है (क्योंकि कई बार केवल कुछ दर्जन लाइनें बदली जाती हैं)। जब आप लिनक्स कर्नेल (जहां 'गिट बिसेक्ट' का भारी इस्तेमाल होता है) में ट्रैकिंग प्रतिगमन की कल्पना करते हैं, तो आप आसानी से देख सकते हैं कि यह पूरी परियोजना को डीबग करने का प्रयास करने से तेज क्यों है। –

+0

@ टॉममार्टनल: यह एक बहुत ही महत्वपूर्ण बात है और मुझे पहले ही उल्लेख करना चाहिए था। –

संबंधित मुद्दे