我以某种方式设法破坏了我的计算机,因此每当我尝试使用使用 ptrace 来跟踪另一个进程(例如 strace、gdb)的东西时,我都会立即遇到分段错误。
例如:
# strace /bin/true execve("/bin/true", ["/bin/true"], [/* 27 vars */]) = 0 --- SIGSEGV(分段错误)@ 0 (0) --- +++ 被 SIGSEGV 杀死 +++
或使用 gdb:
# gdb /bin/true GNU gdb Fedora (6.8-27.el5) 版权所有 (C) 2008 Free Software Foundation, 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 似乎修复了它。
在使用 CONFIG_PREEMPT 重建的“Red Hat Enterprise Linux Client 5.5”内核 2.6.18-194 上使用时,我遇到了同样的 gdb/strace 问题。
CONFIG_PREEMPT_VOLUNTARY 似乎工作正常。