ওবুন্টু 14.04 এ রিলিজ আপডেট করতে অক্ষম


27

আমি বর্তমানে একটি উবুন্টু 14.04 বাক্সকে জেনিয়ালে আপগ্রেড করার চেষ্টা করছি। আমি রিলিজ আপডেটটি করার চেষ্টা করছি, এবং ইউনিকোড ডিকোড এরিয়ারের মতো ত্রুটিযুক্ত ক্ষেত্রে এটি ব্যর্থ: 'utf-8' কোডেক 38x2 পয়েন্টে 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। সেই প্যাকেজটি সরিয়ে ফেলার সাথে এটি ঠিক করা উচিত। তবে এটি প্রতিটি ক্ষেত্রে পৃথক, তাই আমি এই সিদ্ধান্তে পৌঁছানোর জন্য নেওয়া পদক্ষেপগুলি বর্ণনা করব। এটি একটি মোটামুটি জটিল প্রক্রিয়া।

এটি মজাদার একটি, কারণ পাইথন 3 স্ট্রিংগুলি সবগুলি ইউটিএফ -8 এ থাকা উচিত । আপনার এখানে যা আছে (সত্যের পরে আবিষ্কার হয়েছে) এটি একটি সি মডিউল ( apt_pkg) কোনওরকমে অ-ইউটিএফ -8 ডেটা একটি পাইথন 3 স্ট্রিংয়ের মধ্যে সন্নিবেশ করানো হয়েছে, সুতরাং স্ট্রিংটি পড়ার প্রতিটি প্রচেষ্টা ভঙ্গ করুন - লক্ষ্য করুন কীভাবে ত্রুটি হ্যান্ডলার নিজেও একটি ব্যতিক্রম ছুঁড়ে ফেলেছে?

মধ্যে অজানা ডিবাগার আমরা যান!

এই জাতীয় সমস্যাগুলি নির্ণয়ের সর্বোত্তম উপায় হ'ল ব্যর্থ হওয়া লাইনের আগে ডিবাগারকে বিরতি দেওয়া। পাইথনের সাথে, যখন আপনার মতো নেস্টেড কলগুলির একটি সিরিজ থাকে তখন কোনও ডিবাগার বিরতি যুক্ত করার সহজতম উপায় হ'ল ফাইলটি সম্পাদনা করা।

  1. আপনার উদাহরণ ব্যবহার করে আমরা দেখতে পাচ্ছি যে প্রশ্নে ব্যর্থতাটি ফাইল /tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeCache.pyলাইন ৮০6 এ রয়েছে, সুতরাং আসুন একটি পাঠ্য সম্পাদক সম্পাদনা করুন এবং সেই লাইনে যান। প্রতিটি রানের জন্য অস্থায়ী পথটি আলাদা হবে, সুতরাং আপনার ত্রুটি আউটপুট থেকে আপনি এটি ব্যবহার করেছেন তা নিশ্চিত করুন!

    সম্পাদকের স্ক্রিনশট

  2. এখান থেকে, আমরা প্রথমে ত্রুটির ঠিক আগে ৮66 লাইন সন্নিবেশ করে ডিবাগারটিতে একটি সাধারণ বিরতি যুক্ত করতে পারি import pdb; pdb.set_trace();। কারণ এটি পাইথন, ইন্ডেন্টেশনটি গুরুত্বপূর্ণ!

    ডিবাগিং স্টেটমেন্টের স্ক্রিনশট

  3. এখন আমাদের পরিবর্তিত প্রোগ্রামটি চালানো দরকার। do-release-upgradeআবার দৌড়াবেন না; এটি সম্ভবত একটি নতুন ডাউনলোড করবে। ত্রুটি লগগুলিতে দেখুন, "আসল ব্যতিক্রম ছিল" এর পরে প্রথম লাইন? এক সাথে /tmp/ubuntu-release-upgrader-woadaq_z/xenial? এটিই আপনি চালাতে চান। সুতরাং সেই ফাইলটি চালান, মূল হিসাবে (বা sudo)।

    চালানো যা আপনাকে ডিবাগারে (পিডিবি) প্রবেশ করতে পারে:

    ডিবাগারের স্ক্রিনশট

  4. এখান থেকে, আমরা মোট কতগুলি প্যাকেজ রয়েছে তা সনাক্ত করি। সহজ উপায় যে কাজ করতে চালানো হয় sum(1 for _ in self)। কিছুটা অপেক্ষা করুন (এটি কিছুক্ষণ সময় নিতে পারে) এবং এটি একটি সংখ্যা মুদ্রণ করবে। এই ক্ষেত্রে, এটি ছিল 76028

    এখন, যেহেতু সম্ভবত ত্রুটিটি প্রথম কয়েকটিতে ঘটে না, এবং আমরা> 75000 প্যাকেজগুলি নিজেই পদক্ষেপ নিতে চাই না, এবং আমরা একটি ব্যতিক্রম হ্যান্ডলার যোগ করতে পারি না (কারণ ত্রুটিটি এত খারাপ যে এটি পাইথনকেই ভেঙে ফেলে) , আমাদের একটি বিকল্প প্রয়োজন।

  5. পদক্ষেপ 4 এ যুক্ত লাইনটি সরান every প্রতিটি প্যাকেজের জন্য বাড়ানো নম্বর মুদ্রণের জন্য কোডটি সম্পাদনা করুন। উদাহরণস্বরূপ, foo = 0802 লাইনে এবং foo += 1; print(foo)807 লাইনে লুপের উপরে (ত্রুটিযুক্ত লাইনের ঠিক আগে) যুক্ত করুন।

    নম্বর মুদ্রণ কোডের স্ক্রিনশট

  6. পদক্ষেপ 3 হিসাবে একই কমান্ডটি ব্যবহার করে আবার কোড চালনা করুন এটি সংখ্যার একটি বৃহত তালিকা মুদ্রণ করবে। এটি ত্রুটিটি আবার মুদ্রণ না করা পর্যন্ত চলতে দিন। আপনার উইন্ডোটি বাড়ানোর দরকার হতে পারে:

    সংখ্যা আউটপুট এর স্ক্রিনশট

    শেষ নম্বরটিটি প্যাকেজটিতে ক্র্যাশ হওয়া উচিত। এই নম্বরটি নোট রাখুন।

  7. এখন আপনি কী জানেন যে কোন প্যাকেজ / নম্বরটি ক্র্যাশ ঘটায়, সেই সময়টি কেবলমাত্র সেই প্যাকেজটিতে চালানো শর্তের সাথে ডিবাগার বিরতি যুক্ত করার সময় এসেছে। উদাহরণস্বরূপ, আপনি যদি প্যাকেজটিতে ক্রাশ হন 72285তবে if foo == 72285: import pdb; pdb.set_trace()প্রিন্ট করা লাইনের ঠিক পরে যুক্ত করুন foo:

    নতুন পিডিবি বিরতির স্ক্রিনশট

  8. আবার কোড চালান। এখন আপনি যখন pdbএটি প্রবেশ করবেন তখন প্যাকেজটিতে থাকা উচিত যা ক্র্যাশ ঘটায়। আপনি pkgএর মানটি মুদ্রণের জন্য ভেরিয়েবলের নামে টাইপ করতে পারেন , যা আপনাকে বর্তমান প্যাকেজের নামটি বলবে:

    প্যাকেজ নামের স্ক্রিনশট

    আরও সাধারণভাবে, কোনও ভেরিয়েবলের নামে টাইপ করলে এর আউটপুট প্রিন্ট হবে।

  9. আপত্তিজনক প্যাকেজটি সরান এবং আবার আপগ্রেড চেষ্টা করুন (একটি ক্লিন-রিলিজ-আপগ্রেড থেকে)।


7
এটি জিডিবিতে খুব সুন্দর, খুব মৃদু পরিচয়, যা যে কোনও ব্যবহারকারীর দ্বারা বিভিন্ন স্তরের দক্ষতার সাথে ব্যবহার করা যেতে পারে। আমার কাছ থেকে +1 এবং কুদোস। এবং, বিটিডাব্লু, আপনি কেবল যুক্ত করতে পারেন যে ডিবাগারে টাইপ করা পিকেজি একই নামের ভেরিয়েবলের মান প্রিন্ট করবে যেটি ৮০৩ লাইনে সংজ্ঞায়িত করা হয়েছে। অন্য কথায়, পি কেজি কোনও ডিবাগার নির্দেশ নয়। চিয়ার্স।
মারিয়াসমাতুটিয়

@ মারিয়াসমাতুটিয়া সম্পাদিত। এবং এটি পিডিবি;) (এটি আসলে এই শ্রেণীর সমস্যাগুলি সমাধান করার জন্য আরও সুনির্দিষ্টভাবে লক্ষ্য করা উচিত ছিল, তবে এটি খুব ভাল যে আপনি সাধারণ পরিচিতি হিসাবে অনুসরণ করা সহজ মনে করেন nice)
বব

বিশেষত এই সমস্যাটি সমাধান করার জন্য, স্ক্রিপ্টে কেবল একটি লাইন যুক্ত করা কি সহজ নয় যে ডাবগ বার্তাটি যে প্যাকেজ রেকর্ডের অস্তিত্ব নেই তার জন্য যা মুদ্রণ করতে চায় তা মুদ্রণ করে? (ঠিক উপরে উপরে লগিং.দেবগ বার্তাটি রয়েছে) বা এটি কি ধরে নিয়েছে যে পিক্জি ভেরিয়েবলটি বাগের কারণে কিছুটা মুদ্রণযোগ্য হতে পারে না, এবং পাইথন ডিবাগার কিছুতেই মুদ্রণ করতে পারে?
প্রতিটি

আমাদের কাছে যদি এখনও সুপার ইউজার ব্লগ থাকে তবে এটি এটির জন্য একটি দুর্দান্ত সংযোজন হবে!
কানাডিয়ান লুক পুনরায় ইনস্টল করুন মনিকা

তত্ত্বের ক্ষেত্রে হ্যাঁ অনুশীলনে, লিঙ্কযুক্ত বাগ রিপোর্ট থেকে অনুরূপ পরামর্শটি আপাতভাবে কাজ করে নি (কেন আমি নিশ্চিত নই, কেবল ওপি আমাকে যা বলেছেন তা থেকে) এবং অন্য কিছু ক্রাশ হওয়ার ক্ষেত্রে আমি ইন্টারেক্টিভভাবে এটি শেষ করেছি - যেমন না জেনে রাখুন যে এক্ষেত্রে এটি recordসম্পত্তি ছিল যা পড়া যায়নি।
বব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.