Linux 获得海森堡类strace输出的方法
我正在linux x64进程中追踪一个海森堡。(使用调试器或strace连接到进程会使问题永远不会发生。)当代码检测到错误并以这种方式连接到gdb时,我能够放入无限循环,但它只是向我表明,应该工作的文件描述符(fd)不再有效。我真的很想得到fd的历史记录,因此尝试strace,但当然这不会让问题得到解决 其他因素表明gdb/strace的问题在于时间。我尝试过用Linux 获得海森堡类strace输出的方法,linux,polling,strace,Linux,Polling,Strace,我正在linux x64进程中追踪一个海森堡。(使用调试器或strace连接到进程会使问题永远不会发生。)当代码检测到错误并以这种方式连接到gdb时,我能够放入无限循环,但它只是向我表明,应该工作的文件描述符(fd)不再有效。我真的很想得到fd的历史记录,因此尝试strace,但当然这不会让问题得到解决 其他因素表明gdb/strace的问题在于时间。我尝试过用-etrace=desc甚至-eraw=open运行strace,并将其输出到ramdisk,看看这是否能以正确的方式减少strace开
-etrace=desc
甚至-eraw=open
运行strace,并将其输出到ramdisk,看看这是否能以正确的方式减少strace开销,从而触发问题,但没有成功。我试着运行strace+,但它比strace慢一个数量级
我附加到的进程部分是一个我没有源代码访问权限的商业二进制文件,部分是我预加载到进程空间的代码,因此printf
-无处不在不是100%可能的
您对如何追踪fd历史有何建议
更新:添加了关于strace+的注释我通过以下方式解决了跟踪问题:
open()
,close()
和poll()
(实际问题是一场竞赛,内核的
poll()
尝试访问pollfd
内存并返回EFAULT
)程序是多线程的吗?也许,fd已经在其他线程中关闭了,fd
。这是另一个原因,我真的很想从操作系统的角度来看fd发生了什么。解决类似问题的正确方法是完全消除错误的可能性。重构您的代码,使您有一个“拥有”一个文件的线程,该文件将直接打开、读取和关闭该文件,并且其他线程只能从线程安全队列请求读/写(使用锁/计数信号量是另一种可能,但队列通常更易于写入且更安全)@Lie Ryan:如果我拥有所有的代码,这是可能的,但在这种情况下,我只控制预加载的代码,这就是为什么我仍然试图获得关于如何从外部监控fd的建议。