2

我在 linux x64 进程中追逐一个 Heisenbug。(使用调试器或 strace 附加到进程使问题永远不会发生。)当代码检测到故障并以这种方式附加 gdb 时,我已经能够进入无限循环,但它只是向我显示了一个文件应该工作的描述符 (fd) 不再有效。我真的很想了解 fd 的历史,因此尝试了 strace,但这当然不会让问题回购。

其他因素表明 gdb/strace 的问题在于时间。我尝试使用 -etrace=desc甚至运行 strace-eraw=open并输出到 ramdisk 以查看是否会以正确的方式减少 strace 开销以触发问题,但没有成功。我尝试运行 strace+,但它比 strace 慢了一个数量级。

我要附加的进程部分是我无法访问源代码的商业二进制文件,部分是我预加载到进程空间中的代码,所以printf-everywhere 不是 100% 可能的。

你对如何追踪 fd 历史有什么建议吗?

更新:添加了关于 strace+ 的注释

4

1 回答 1

1

我通过以下方式解决了跟踪问题:

  1. 围绕相关系统调用预加载包装存根函数open()close()以及poll()
  2. 在 ramdisk 上创建的文件名中记录相关信息。

(实际问题是一场竞赛,内核的poll()字符串访问pollfd内存并返回EFAULT。)

于 2013-12-18T17:29:36.447 回答