Linux strace:order of<;未完成…>;以及<;。。。恢复>;
我正在编写一个脚本,用于分析使用Linux strace:order of<;未完成…>;以及<;。。。恢复>;,linux,strace,Linux,Strace,我正在编写一个脚本,用于分析使用strace跟踪的文件访问 跟踪包含一些已被另一进程中断的调用strace用和(在中断关闭呼叫的情况下)标记显示它们 还是应该重建为 B [pid 26817]12:48:22.972737关闭(449)=0 [pid 28708]12:48:22.972797 fcntl(451,F_SETFD,FD_CLOEXEC 这里的顺序至关重要,因为在未完成的和恢复的之间可能有多个调用,其中一个调用可能会对此时即将关闭的文件执行某些操作。当strace写入行close
strace
跟踪的文件访问
跟踪包含一些已被另一进程中断的调用strace
用
和
(在中断关闭
呼叫的情况下)标记显示它们
还是应该重建为
B
[pid 26817]12:48:22.972737关闭(449)=0
[pid 28708]12:48:22.972797 fcntl(451,F_SETFD,FD_CLOEXEC
这里的顺序至关重要,因为在未完成的
和恢复的
之间可能有多个调用,其中一个调用可能会对此时即将关闭的文件执行某些操作。当strace
写入行close时,系统调用开始(449),并在输出时结束
close
不会被任何其他调用或信号中断:另一个调用由另一个进程执行,而内核正在关闭文件描述符
无法知道关闭文件描述符的确切时间点是哪一点;您只知道在执行系统调用之前它不会关闭,并且在系统调用完成时它会关闭。跟踪是正确的,您的“重建”不是。如果调用没有重叠,跟踪一开始看起来可能是A或B。我不认为strace
是错误的。;)我想知道句柄为449
的文件何时不再打开。我的理解是close()
调用已被另一个调用中断。如果它实际上正在进行,而另一个进程正在这71毫秒内进行另一个系统调用,这可能与纯技术观点完全不同,但在我的情况下是相同的:当strace
看到时,文件将被关闭unfinished
。不是吗?如果程序在调用close()
后仍在使用文件描述符,那就是一个bug。如果进程在close()
返回之前再次尝试打开文件,那也可能表示一个bug。因此,调用和返回都显示在跟踪中。请记住,“unfinished”并不意味着什么“在内核级别中断”。相反,这意味着28708的close()系统调用需要一些时间(大约71 usec),在这段时间内,另一个进程/线程启动了一个新的系统调用-28708启动了一个fcntl()。因为strace不能报告返回值(或任何修改的结构“输出”值)在该调用完成之前,它将报告分为两部分:使用“未完成”的调用启动和使用“恢复”的调用完成。如前所述,这具有strace输出交错系统调用报告。
[pid 26817] 12:48:22.972737 close(449 <unfinished ...>
[pid 28708] 12:48:22.972797 fcntl(451, F_SETFD, FD_CLOEXEC <unfinished ...>
[pid 26817] 12:48:22.972808 <... close resumed> ) = 0
strace -f -tt -p <pid>
[pid 28708] 12:48:22.972797 fcntl(451, F_SETFD, FD_CLOEXEC <unfinished ...>
[pid 26817] 12:48:22.972808 close(449) = 0
[pid 26817] 12:48:22.972737 close(449) = 0
[pid 28708] 12:48:22.972797 fcntl(451, F_SETFD, FD_CLOEXEC <unfinished ...>