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

use*_*952 5 bash segmentation-fault su gdb

问题示例:

$ su
Segmentation fault
$ sudo ls
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

我之前尝试从源代码编译 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)
Run Code Online (Sandbox Code Playgroud)

当我尝试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
Run Code Online (Sandbox Code Playgroud)

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

Jor*_*Lis 2

使用aptdcon,它与apt-daemonvia进行通信dbus,因此不需要susudo,来重新安装损坏的软件包。也许您最好的机会是重新安装所有软件包。

首先,确保不存在等待修复的损坏安装:

aptdcon --fix-install
Run Code Online (Sandbox Code Playgroud)

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

df -h
Run Code Online (Sandbox Code Playgroud)

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

echo \"$(dpkg --get-selections | grep install | cut -f 1)\"
Run Code Online (Sandbox Code Playgroud)

将其保存到以后,在某个文本编辑器上。然后,aptdcon使用完整的包列表进行如下调用:

aptdcon --reinstall "package1 package2 package3..."
Run Code Online (Sandbox Code Playgroud)

我这样告诉你是因为由于aptdcon各种原因无法重新安装某些软件包,因此如果你aptdcon对此感到不满,则必须将它们删除,然后重试,可能不止一次。