strace:<未完成...>和<...已恢复>的顺序

try*_*lly 6 linux strace

我正在编写一个脚本,用于分析以跟踪的文件访问strace

跟踪中包含一些已被另一个进程中断的调用。strace使用<unfinished ...><... close resumed>(在close通话中断的情况下)标记向他们显示。

[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 
Run Code Online (Sandbox Code Playgroud)

该进程及其所有线程均已通过以下方式跟踪

strace -f -tt -p <pid>
Run Code Online (Sandbox Code Playgroud)

手册页不确定调用何时完成。

如果正在执行系统调用,同时正在从不同的线程/进程调用另一个系统调用,则strace将尝试保留这些事件的顺序,并将正在进行的调用标记为未完成。呼叫返回时,它将被标记为已恢复。

尽管我假设是这样,但resumed标记自然会指示该呼叫现在已经结束。我想问是否是这样。

可以将上述跟踪摘要重构为

一种

[pid 28708] 12:48:22.972797 fcntl(451, F_SETFD, FD_CLOEXEC <unfinished ...>
[pid 26817] 12:48:22.972808 close(449) = 0
Run Code Online (Sandbox Code Playgroud)

还是应该重建为

[pid 26817] 12:48:22.972737 close(449) = 0 
[pid 28708] 12:48:22.972797 fcntl(451, F_SETFD, FD_CLOEXEC <unfinished ...>
Run Code Online (Sandbox Code Playgroud)

这里的顺序至关重要,因为unfinished和之间可能有多个调用,resumed并且其中一个可能会对当前将要关闭的文件执行某些操作。

Jua*_*des 5

系统调用在写行时开始,在输出时结束straceclose(449 <unfinished ...><... close resumed>

close不被任何其他呼叫或信号中断:对方通话被另一进程执行的,而内核关闭您的文件描述符。

没有办法知道关闭文件描述符的确切时间。您所知道的唯一一件事是在执行系统调用之前它不会关闭,并且在系统调用完成时它会关闭。

  • 请记住,“未完成”并不意味着“在内核级别中断”。相反,这意味着 28708 的 close() 系统调用需要一些时间(大约 71 us),在此期间,不同的进程/线程启动了一个新的系统调用 - 28708 启动了 fcntl()。由于 strace 在此类调用完成之前无法报告返回值(或任何修改后的结构“输出”值),因此它将报告分为两部分:带有“未完成”的调用启动和带有“恢复”的调用完成。如前所述,它具有 strace 输出交错系统调用报告。 (3认同)