我正在linux x64进程中追逐一个Heisenbug。 (使用调试器或strace附加到进程会导致问题永远不会发生。)当代码检测到错误并以这种方式附加gdb时,我已经能够进入无限循环,但它只是向我显示了一个文件应该工作的描述符(fd)不再有效。我真的想得到一个fd的历史,因此尝试strace,但当然不会让问题回复。
其他因素表明gdb / strace的问题是时间问题。我已经尝试使用-etrace=desc
甚至-eraw=open
运行strace并输出到ramdisk以查看是否会以正确的方式减少strace开销来触发问题,但没有成功。我试过运行strace +,但它比strace慢一个数量级。
我附加的流程部分是商业二进制文件,我没有源代码访问权限,部分代码我预先加载到进程空间,所以printf
- 无处不在100%。
您对如何追踪fd历史有什么建议吗?
更新:添加了关于strace +
的说明答案 0 :(得分:1)
我通过以下方式解决了追踪问题:
open()
,close()
和poll()
(实际问题是竞赛,内核poll()
要访问pollfd
内存并返回EFAULT
。)