使用 su 或 sudo 时出现分段错误

使用 su 或 sudo 时出现分段错误

问题示例:

$ su
Segmentation fault
$ sudo ls
Segmentation fault

我之前尝试从源代码编译 sqlite3。我不知道它安装了什么库。这可能是发生这种情况的原因。

我尝试了一下strace su并得到以下结果:

...
fstat64(6, {st_mode=S_IFREG|0644, st_size=17964, ...}) = 0
mmap2(NULL, 20788, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0xb7295000
mmap2(0xb7299000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x3) = 0xb7299000
close(6)                                = 0
mprotect(0xb7299000, 4096, PROT_READ)   = 0
mprotect(0xb72f9000, 4096, PROT_READ)   = 0
set_tid_address(0xb758a728)             = 11144
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV (core dumped) +++
Segmentation fault (core dumped)

当我尝试gdb su运行时,它给了我Cannot find new threads: generic error。我在网上寻找解决问题的方法,遇到了线程,然后尝试运行LD_PRELOAD=/lib/i386-linux-gnu/libpthread.so.0 gdb su(如线程中建议的那样)。当我再次尝试运行它时,它给出了相同的错误。

根据 strace,我认为它的线程处理方式存在一些问题,但我不知道如何修复它。有没有办法重新安装基本的 bash 实用程序?

以下是有关我的系统的更多信息:

$ uname -a
myhost 3.2.0-37-generic-pae #58-Ubuntu SMP Thu Jan 24 15:51:02 UTC 2013 i686 i686 i386 GNU/Linux

(我很确定硬件是 64 位的)

答案1

使用,它与viaaptdcon通信,因此不需要或,重新安装损坏的软件包。最好的办法可能是重新安装所有软件包。apt-daemondbussusudo

首先,确保没有损坏的安装需要修复:

aptdcon --fix-install

还要确保磁盘上有可用空间:

df -h

然后,获取当前安装的软件包列表:

echo \"$(dpkg --get-selections | grep install | cut -f 1)\"

将其保存到文本编辑器中以供日后使用。然后,aptdcon使用完整包列表像这样调用:

aptdcon --reinstall "package1 package2 package3..."

我之所以这样告诉你,是因为aptdcon出于各种原因,无法重新安装某些软件包,所以如果你aptdcon觉得有必要,就必须将它们删除,然后再试一次,可能还要试多次。

答案2

我看到了这个问题,但根本原因略有不同。我一直在测试 Kerberos,我的 /etc/krb5.conf 中有一些配置错误。我通过 strace 发现 sudo 在读取该文件后不久就出现了分段错误,所以我猜想我的配置文件有问题。我没有追踪到特定的变量,但有一点很突出,那就是我在 krb5.conf 中将 default_domain 变量设为空,如下所示

[libdefaults]
   default_realm = 

这可能会导致 sudo 中的一些粗心代码生成零长度字符串并以某种方式错误处理它,从而导致 SIGSEGV。我没有尝试进一步调试它,因为这不是正确的设置。我只是删除了我的 /etc/krb5.conf。

答案3

这可能是由 samba 的 pam 模块导致的。

如果是这种情况,那么这应该可以解决问题:

  • 重启机器并选择启动到恢复模式。如果你看不到恢复模式,那么你首先需要选择“高级选项”选项。
  • 从恢复菜单中选择“进入 root shell”
  • 执行命令:dpkg --purge libpam-smbpass
  • 执行命令:dpkg --purge libpam-winbind

然后您应该能够再次使用“su”和“sudo”。

然后你可能想要或需要做一个

  • sudo apt-get -f 安装

以帮助修复任何剩余的损坏包裹。

如果您需要 libpam-smbpass 和/或 libpam-winbind 包,或者“samba”包损坏,您可能会发现必须删除或重命名 /var/lib/samba/secrets.tdb:

  • sudo mv /var/lib/samba/secrets.tdb /var/lib/samba/secrets.tdb.old

来源/相关:https://bugs.launchpad.net/ubuntu/+source/samba/+bug/260687

答案4

如果您遇到了 OP 所遇到的问题,那么您无法按照 Jorge Suárez de Lis 的建议去做,因为它会引发依赖错误。

所以,

aptdcon --reinstall "libsqlite3-0"

aptdcon --install "libsqlite3-0"

返回错误信息:

错误:org.debian.apt.TransactionFailed-error-cache-broken:以下软件包具有未满足的依赖关系:

在执行此操作时:

aptdcon --fix-depends

将修复该问题,并且 su 和 sudo 将再次起作用。

相关内容