为Heisenbug获得类似输出的方法

时间:2013-03-26 03:29:12

标签: linux strace heisenbug

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

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

我附加的流程部分是商业二进制文件,我没有源代码访问权限,部分代码我预先加载到进程空间,所以printf - 无处不在100%。

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

更新:添加了关于strace +

的说明

1 个答案:

答案 0 :(得分:1)

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

  1. 在相关系统调用open()close()poll()
  2. 周围预加载包装器存根函数
  3. 在ramdisk上创建的文件名中记录相关信息。
  4. (实际问题是竞赛,内核poll()要访问pollfd内存并返回EFAULT。)