使用 ptrace 进行启动前分段错误

使用 ptrace 进行启动前分段错误

我以某种方式设法破坏了我的计算机,以便任何时候我尝试使用 ptrace 来跟踪另一个进程(例如 strace、gdb)时,都会立即出现分段错误。

例如:

# strace /bin/true
execve("/bin/true", ["/bin/true"], [/* 27 变量 */]) = 0
--- SIGSEGV(分段错误)@ 0(0)---
+++ 被 SIGSEGV 杀死 +++

或者使用 gdb:

# gdb /bin/true
GNU gdb Fedora(6.8-27.el5)
版权所有 (C) 2008 自由软件基金会,Inc.
许可证 GPLv3+:GNU GPL 版本 3 或更高版本
这是免费软件:您可以自由更改和重新分发它。
在法律允许的范围内,不提供任何保证。输入“显示复制”
并“显示保修”了解详情。
此 GDB 配置为“x86_64-redhat-linux-gnu”...
(未找到调试符号)
(gdb)运行
启动程序:/bin/true

程序因信号 SIGSEGV 终止,出现段错误。
該程序已不再存在。
如果没有要调试的流程,你就无法做到这一点。

rpm -V 在 strace、gdb 和 glibc 上显示干净。我没有设置任何 LD_* 变量,PATH 中也没有任何特殊内容。

更新:问题出现在使用 PREEMPT 重新编译的 kernel-2.6.18-128 内核中。该内核使用 utrace 基础结构模拟 ptrace,并且似乎不同意抢占。kernel-2.6.18-164 似乎修复了这个问题。

答案1

在使用 CONFIG_PREEMPT 重建的“Red Hat Enterprise Linux Client 5.5”内核 2.6.18-194 上使用时,我遇到了同样的 gdb/strace 问题。

CONFIG_PREEMPT_VOLUNTARY 似乎工作正常。

相关内容