当尝试从 14.10 升级到 15.04 时,我运行以下命令。
sudo do-release-upgrade
该命令默默失败,命令提示符上没有任何输出。
我应该首先采取什么步骤来解决这个问题?是否有我可以检查的日志?我习惯于从失败的程序中获得更多反馈。
编辑 1:更多信息...
该命令大约一秒钟后返回,退出代码为 139,表示段错误。
编辑2:
运行以下命令后
sudo strace -o do-release-upgrade.strace do-release-upgrade
您可以在这里找到 strace 输出: http://pastebin.com/hb5zthbb
答案1
好吧,我有一个有点不寻常的答案:
因为它do-release-upgrade
是用 Python 编写的,并且在您的个人资料中您提到您了解 Python,所以我使用了 Python 调试器,对于我来说该程序运行正确。
sudo apt-get install python3-pudb
使用以下命令启动调试器:
pudb3 $(which do-release-upgrade)
并定位问题。
然后我看了看strace
输出。这是最有趣的部分:
stat("/usr/lib/python3/dist-packages/apt_pkg.cpython-34m-x86_64-linux-gnu.so", {st_mode=S_IFREG|0644, st_size=351400, ...}) = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x184e6} ---
我做出一个预测:
sudo apt-get install --reinstall python3-apt
答案2
以下是我采取的调试步骤。
确定失败程序的返回代码
sudo do-release-upgrade echo $?
代码是
139
在谷歌上搜索返回代码以了解其含义
该代码表示出现分段错误
用于
strace
了解错误发生的位置sudo strace -o do-release-upgrade.strace do-release-upgrade
这会将跟踪日志写入名为的文件中
do-release-upgrade.strace
,并且日志底部显示发生故障的运行时文件。运行 pudb3 调试器进行调试
do-release-upgrade
如果尚未安装 pudb3。
sudo apt-get install python3-pudb
运行 pudb3 调试器
sudo pudb3 /usr/bin/do-release-upgrade
对于那些不熟悉调试器的人来说,这使我能够逐步完成脚本的每个执行点。
我很快发现了以下错误。
Traceback (most recent call last): File "/usr/bin/do-release-upgrade", line 10, in <module> from UpdateManager.Core.MetaRelease import MetaReleaseCore File "/usr/lib/python3/dist-packages/UpdateManager/Core/MetaRelease.py", line 25, in <module> import apt File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module> import apt_pkg ImportError: /usr/lib/python3/dist-packages/apt_pkg.cpython-34m-x86_64-linux-gnu.so: undefined symbol: _ZN13pkgSrcRecords4StepEv
这让我想到对应的 ubuntu 错误报告
尝试删除并重新安装错误报告中指出的软件包
第一种方法
sudo apt-get install --reinstall python3-apt
第二种更激烈的方法
sudo dpkg --purge --force-depends python3-apt sudo apt-get install python3-apt
这些都不能解决问题。
结论:
我仍然觉得错误没有打印到 stdout 很奇怪;正常情况下,我认为应该打印到 stdout。此解决方案不应该需要调试器。
这是二进制软件包中的一个错误python3-apt
。如果不修复错误并重新构建软件包,此错误可能会继续存在。