do-release-upgrade 默默失败。故障排除的第一步是什么?

do-release-upgrade 默默失败。故障排除的第一步是什么?

当尝试从 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

以下是我采取的调试步骤。

  1. 确定失败程序的返回代码

    sudo do-release-upgrade
    echo $?
    

    代码是139

  2. 在谷歌上搜索返回代码以了解其含义

    该代码表示​​出现分段错误

  3. 用于strace了解错误发生的位置

    sudo strace -o do-release-upgrade.strace do-release-upgrade
    

    这会将跟踪日志写入名为的文件中do-release-upgrade.strace,并且日志底部显示发生故障的运行时文件。

  4. 运行 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 错误报告

  5. 尝试删除并重新安装错误报告中指出的软件包

    第一种方法

    sudo apt-get install --reinstall python3-apt
    

    第二种更激烈的方法

    sudo dpkg --purge --force-depends python3-apt
    sudo apt-get install python3-apt
    

    这些都不能解决问题。

结论:

我仍然觉得错误没有打印到 stdout 很奇怪;正常情况下,我认为应该打印到 stdout。此解决方案不应该需要调试器。

这是二进制软件包中的一个错误python3-apt。如果不修复错误并重新构建软件包,此错误可能会继续存在。

相关内容