我在 linux x64 进程中追逐一个 Heisenbug。(使用调试器或 strace 附加到进程使问题永远不会发生。)当代码检测到故障并以这种方式附加 gdb 时,我已经能够进入无限循环,但它只是向我显示了一个文件应该工作的描述符 (fd) 不再有效。我真的很想了解 fd 的历史,因此尝试了 strace,但这当然不会让问题回购。
其他因素表明 gdb/strace 的问题在于时间。我尝试使用 -etrace=desc
甚至运行 strace-eraw=open
并输出到 ramdisk 以查看是否会以正确的方式减少 strace 开销以触发问题,但没有成功。我尝试运行 strace+,但它比 strace 慢了一个数量级。
我要附加的进程部分是我无法访问源代码的商业二进制文件,部分是我预加载到进程空间中的代码,所以printf
-everywhere 不是 100% 可能的。
你对如何追踪 fd 历史有什么建议吗?
更新:添加了关于 strace+ 的注释