我目前正在尝试将 ubuntu 14.04 盒子升级到 xenial。我正在尝试进行发布更新,但它失败并出现错误,例如 UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 382: invalid start byte
它看起来像是一个已知的错误- 我已经尝试过,但没有找到有问题的包,并禁用/删除了我的 2 个非标准 package.lst 文件,用于 nodesource 和 veeam 存储库。
回溯读取如下内容
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) ===
Run Code Online (Sandbox Code Playgroud)
日志中没有任何真正有用的东西。我如何让 do-release 更新工作?
Bob*_*Bob 44
您拥有的是升级脚本本身在某处绊倒无效数据。您需要查找并删除无效数据。
在这种情况下,它是 package veeamsnap。删除该包应该可以修复它。但是因为这对于每种情况都是不同的,所以我将描述为得出该结论而采取的步骤。这是一个相当复杂的过程。
这很有趣,因为 python3 字符串都应该是 UTF-8。你在这里(事后发现)是一个 C 模块 ( apt_pkg) 以某种方式将非 UTF-8 数据插入到 python3 字符串中,因此破坏了读取字符串的每一次尝试——注意错误处理程序本身是如何抛出异常的?
诊断此类问题的最佳方法是使调试器在失败的行之前暂停。使用 Python,当您有一系列像这样的嵌套调用时,添加调试器暂停的最简单方法是编辑文件本身。
使用您的示例,我们可以看到有问题的失败在文件/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeCache.py806 行中,因此让我们启动文本编辑器并转到该行。每次运行的临时路径都会不同,因此请确保使用错误输出中的路径!
从这里开始,我们可以首先在调试器中添加一个简单的暂停,方法import pdb; pdb.set_trace();是在错误之前的第 806 行插入。因为这是 Python,所以缩进很重要!
现在我们需要运行修改后的程序。不要再跑do-release-upgrade了;那可能会下载一个新的。在错误日志中看到“原始异常是”之后的第一行?与/tmp/ubuntu-release-upgrader-woadaq_z/xenial? 那就是你想跑的。因此,以root(或sudo)身份运行该文件。
运行它应该会让你进入调试器(pdb):
从这里,我们计算出总共有多少个包。做到这一点的简单方法是运行sum(1 for _ in self). 稍等(这可能需要一段时间),它将打印一个数字。在这种情况下,它是76028.
现在,由于错误可能不会发生在前几个,而且我们不想手动单步执行 >75000 个包,而且我们无法添加异常处理程序(因为错误太严重了,它破坏了 Python 本身) ,我们需要一个替代方案。
删除在步骤 4 中添加的行。编辑代码以打印出每个包的递增数字。例如,foo = 0在第 802 行和foo += 1; print(foo)第 807 行(就在出错行之前)的循环上方添加。
再次运行代码,使用与步骤 3 中相同的命令。它将打印一个大的数字列表。让它继续运行,直到它再次打印错误。您可能需要放大您的窗口:
最后一个数字应该是它崩溃的包。记下那个号码。
现在您知道哪个包/编号导致崩溃,是时候添加调试器暂停,并设置只在该包上执行的条件。例如,如果您在 package 上崩溃,请在打印的行之后72285添加:if foo == 72285: import pdb; pdb.set_trace()foo
再次运行代码。现在,当您进入pdb它时,它应该位于导致崩溃的包上。您可以输入变量的名称pkg以打印其值,这将告诉您当前包的名称:
更一般地,输入任何变量的名称将打印其输出。
删除有问题的软件包并再次尝试升级(从干净的 do-release-upgrade 中)。
| 归档时间: |
|
| 查看次数: |
2099 次 |
| 最近记录: |