Ubuntu 14.04 पर रिलीज़ अपडेट करने में असमर्थ


27

मैं वर्तमान में xubial के लिए ubuntu 14.04 बॉक्स को अपग्रेड करने की कोशिश कर रहा हूं। मैं रिलीज अपडेट करने की कोशिश कर रहा हूं, और यूनिकोडडाउज़ररूट जैसी त्रुटियों के साथ इसकी असफलता: 'utf-8' कोडेक 38x स्थिति में 0x96 को बाइट नहीं कर सकता: अमान्य प्रारंभ बाइट

यह एक ज्ञात बग की तरह दिखता है - मैंने कोशिश की है और आपत्तिजनक पैकेज खोजने के लिए कोई भाग्य नहीं था, और नोड्ससोर्स और वाइम रिपॉजिटरी के लिए मेरे 2 गैर मानक पैकेज.लस्ट फ़ाइलों को अक्षम / हटा दिया।

ट्रेसबैक कुछ इस तरह पढ़ता है

Traceback (most recent call last):
  File "/tmp/ubuntu-release-upgrader-woadaq_z/xenial", line 8, in <module>
    sys.exit(main())
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeMain.py", line 242, in main
    if app.run():
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeController.py", line 1876, in run
    return self.fullUpgrade()
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeController.py", line 1757, in fullUpgrade
    if not self.doPostInitialUpdate():
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeController.py", line 943, in doPostInitialUpdate
    self.tasks = self.cache.installedTasks
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeCache.py", line 806, in installedTasks
    for line in pkg._pcache._records.record.split("\n"):
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 382: invalid start byte
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/problem_report.py", line 416, in add_to_existing
    self.write(f)
  File "/usr/lib/python3/dist-packages/problem_report.py", line 369, in write
    block = f.read(1048576)
  File "/usr/lib/python3.4/codecs.py", line 319, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

Original exception was:
Traceback (most recent call last):
  File "/tmp/ubuntu-release-upgrader-woadaq_z/xenial", line 8, in <module>
    sys.exit(main())
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeMain.py", line 242, in main
    if app.run():
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeController.py", line 1876, in run
    return self.fullUpgrade()
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeController.py", line 1757, in fullUpgrade
    if not self.doPostInitialUpdate():
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeController.py", line 943, in doPostInitialUpdate
    self.tasks = self.cache.installedTasks
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeCache.py", line 806, in installedTasks
    for line in pkg._pcache._records.record.split("\n"):
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 382: invalid start byte
=== Command terminated with exit status 1 (Mon Apr  3 09:31:21 2017) ===

और लॉग में वास्तव में उपयोगी कुछ भी नहीं है। मुझे काम करने के लिए अपडेट-रिलीज़ कैसे मिलेगा?

जवाबों:


44

आपके पास जो कुछ भी है, वह अमान्य डेटा पर ट्रिपिंग स्क्रिप्ट ही है। आपको अमान्य डेटा खोजने और निकालने की आवश्यकता है।

इस मामले में, यह पैकेज था veeamsnap। उस पैकेज को हटाकर इसे ठीक करना चाहिए। लेकिन क्योंकि यह प्रत्येक मामले के लिए अलग है, मैं उस निष्कर्ष तक पहुँचने के लिए उठाए गए कदमों का वर्णन करूँगा। यह काफी जटिल प्रक्रिया है।

यह एक मजेदार है, क्योंकि python3 तार सभी UTF-8 में होने चाहिए । आपके पास यहां क्या है (इस तथ्य के बाद पता चला) एक सी मॉड्यूल ( apt_pkg) है जो किसी भी तरह से गैर-यूटीएफ -8 डेटा को अजगर 3 स्ट्रिंग में डाल रहा है, इसलिए स्ट्रिंग को पढ़ने के हर प्रयास को तोड़ रहा है - नोटिस करें कि त्रुटि हैंडलर ने खुद एक अपवाद भी कैसे फेंक दिया?

में अज्ञात डिबगर हम चले!

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

  1. आपके उदाहरण का उपयोग करते हुए, हम देख सकते हैं कि प्रश्न में विफलता फ़ाइल /tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeCache.pyलाइन 806 में है, इसलिए चलो एक टेक्स्ट एडिटर को फायर करें और उस लाइन पर जाएं। प्रत्येक रन के लिए अस्थायी रास्ता अलग होगा, इसलिए सुनिश्चित करें कि आप अपनी त्रुटि आउटपुट से एक का उपयोग करते हैं!

    संपादक का स्क्रीनशॉट

  2. यहां से, हम पहली बार डिबगर में एक साधारण ठहराव जोड़ सकते हैं, import pdb; pdb.set_trace();त्रुटि से ठीक पहले लाइन 806 पर डालकर । क्योंकि यह पायथन है, इंडेंटेशन महत्वपूर्ण है!

    डिबगिंग स्टेटमेंट का स्क्रीनशॉट

  3. अब हमें संशोधित कार्यक्रम चलाने की आवश्यकता है। do-release-upgradeफिर से मत दौड़ो; वह शायद एक नया डाउनलोड करेगा। त्रुटि लॉग में देखें, "मूल अपवाद था" के बाद पहली पंक्ति? के साथ एक /tmp/ubuntu-release-upgrader-woadaq_z/xenial? जिसे आप चलाना चाहते हैं। इसलिए उस फाइल को रूट (या sudo) के रूप में चलाएं।

    रनिंग जो आपको डीबगर (pdb) में मिलनी चाहिए:

    डिबगर का स्क्रीनशॉट

  4. यहां से, हम यह पता लगाते हैं कि कुल कितने पैकेज हैं। इसे चलाने का आसान तरीका हैsum(1 for _ in self) । थोड़ा इंतजार करें (इसमें थोड़ा समय लग सकता है) और यह एक नंबर प्रिंट करेगा। इस मामले में, यह था 76028

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

  5. चरण 4 में जोड़ी गई रेखा को हटा दें। प्रत्येक पैकेज के लिए इंक्रीमेंट नंबर को प्रिंट करने के लिए कोड को संपादित करें। उदाहरण के लिए, foo = 0लाइन 802 और foo += 1; print(foo)लाइन 807 पर (लूपिंग लाइन से ठीक पहले) लूप के ऊपर जोड़ें ।

    नंबर प्रिंटिंग कोड का स्क्रीनशॉट

  6. चरण 3 में समान कमांड का उपयोग करके कोड को फिर से चलाएँ। यह संख्याओं की एक बड़ी सूची प्रिंट करेगा। इसे तब तक चलाते रहें जब तक कि यह फिर से त्रुटि न छाप दे। आपको अपनी खिड़की को बड़ा करना पड़ सकता है:

    नंबर आउटपुट का स्क्रीनशॉट

    अंतिम संख्या उस पैकेज की होनी चाहिए जिस पर यह दुर्घटनाग्रस्त हुआ था। उस नंबर का ध्यान रखें।

  7. अब जब आप जानते हैं कि कौन सा पैकेज / नंबर दुर्घटना का कारण बनता है, तो उस पैकेज में केवल निष्पादित करने के लिए डीबगर पॉज जोड़ने की शर्त के साथ समय है। उदाहरण के लिए, यदि आप पैकेज पर क्रैश करते हैं, तो प्रिंट करने वाली लाइन के ठीक बाद 72285जोड़ें :if foo == 72285: import pdb; pdb.set_trace()foo

    नए पीडीबी ठहराव का स्क्रीनशॉट

  8. कोड फिर से चलाएँ। अब जब आप इसमें जाते हैं pdbतो उस पैकेज पर होना चाहिए जो दुर्घटना का कारण बनता है। आप pkgइसके मूल्य को मुद्रित करने के लिए चर के नाम पर टाइप कर सकते हैं , जो आपको वर्तमान पैकेज का नाम बताएगा:

    पैकेज के नाम का स्क्रीनशॉट

    अधिक सामान्यतः, किसी भी चर के नाम से टाइप करने पर उसका आउटपुट प्रिंट होगा।

  9. आपत्तिजनक पैकेज को हटा दें और फिर से अपग्रेड करने का प्रयास करें (एक साफ-सुथरा रिलीज-अपग्रेड से)।


7
यह gdb के लिए एक बहुत अच्छा, बहुत ही सौम्य परिचय है, जिसे किसी भी उपयोगकर्ता के बारे में प्रवीणता के विभिन्न स्तरों के साथ इस्तेमाल किया जा सकता है। +1 मुझसे, और कुडोस। और, BTW, आप बस डिबगर में टाइपिंग pkg जोड़ सकते हैं , उसी नाम के वैरिएबल का मान प्रिंट करेंगे, जैसा कि लाइन 803 पर परिभाषित किया गया है। दूसरे शब्दों में, pkg डिबगर इंस्ट्रक्शन नहीं है। चीयर्स।
MariusMatutiae

@ मारीमैटुटिया एडिटेड। और यह पीडीबी है;) (यह वास्तव में समस्याओं के इस वर्ग को हल करने के लिए विशिष्ट होने के लिए और अधिक विशिष्ट था, लेकिन यह अच्छा है कि आप एक सामान्य परिचय के रूप में अनुसरण करना आसान पाते हैं।)
बॉब

विशेष रूप से इस समस्या को हल करने के लिए, क्या केवल स्क्रिप्ट में एक पंक्ति जोड़ना आसान नहीं होगा जो उस डिबग संदेश को प्रिंट करता है जो पैकेज रिकॉर्ड के लिए प्रिंट करना चाहता है जो मौजूद नहीं है? (Theres that logging.debug message right ऊपर) या यह मान लें कि pkg वैरिएबल बग के कारण बिल्कुल भी प्रिंट नहीं हो सकता है, और अजगर डीबगर कुछ भी प्रिंट कर सकता है?
कासिंगउंडरफ्लोव हर जगह

यदि हमारे पास अभी भी सुपर उपयोगकर्ता ब्लॉग है, तो यह इसके लिए एक उत्कृष्ट अतिरिक्त होगा!
कनाडाई ल्यूक

@CausingUnderflowsEverywhere सिद्धांत में, हाँ। व्यवहार में, लिंक किए गए बग रिपोर्ट से एक समान सुझाव स्पष्ट रूप से काम नहीं कर रहा था (मुझे यकीन नहीं है कि क्यों, ओपी ने मुझे जो बताया है, उससे) और मैंने इसे अंतःक्रियात्मक रूप से करने के मामले में कुछ और दुर्घटना को ट्रिगर किया - जैसे पता है कि इस मामले में यह recordसंपत्ति ही थी जिसे पढ़ा नहीं जा सकता था।
बॉब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.