我以某种方式设法破坏了我的计算机,以便任何时候我尝试使用 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 似乎工作正常。