【问题标题】:strace: order of <unfinished ...> and <... resumed>strace: <unfinished ...> 和 <... resumed> 的顺序
【发布时间】:2014-09-03 04:19:06
【问题描述】:

我正在编写一个脚本来分析使用strace 跟踪的文件访问。

跟踪包含一些已被另一个进程中断的调用。 strace&lt;unfinished ...&gt;&lt;... close resumed&gt;(如果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 

进程及其所有线程已被跟踪

strace -f -tt -p <pid>

手册页不确定调用何时结束。

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

虽然我假设,resumed 标记自然会指示呼叫现已完成。我想问问是不是这样。

上面的痕迹摘录可以重构为

一个

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

还是应该重构为

B

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

这里的顺序很重要,因为unfinishedresumed 之间可能有多次调用,其中一个可能会对目前即将关闭的文件执行某些操作。

【问题讨论】:

  • 跟踪是正确的,你的“重建”不是。如果调用不重叠,则跟踪首先看起来像 A 或 B。
  • 我并没有声称strace 是错误的。 ;) 我想知道带有449 句柄的文件何时不再打开。我的理解是close() 呼叫已被另一个呼叫中断。如果它实际上正在进行中并且另一个进程在这 71 毫秒内进行另一个系统调用,这可能与纯技术角度完全不同,但在我的情况下是相同的:当 strace "看到时文件将被关闭“unfinished。不是吗?
  • 如果程序在调用close()后还在使用文件描述符,那就是bug。如果进程试图在close() 返回之前再次打开文件,这也可能表明存在错误。所以调用和返回都显示在跟踪中。

标签: linux strace


【解决方案1】:

系统调用开始strace写入close(449 &lt;unfinished ...&gt;这一行,结束输出&lt;... close resumed&gt;

close 不会被任何其他调用或信号中断:另一个调用由另一个进程执行,而内核正在关闭您的文件描述符。

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

【讨论】:

  • 请记住,“未完成”并不意味着“在内核级别中断”。相反,这意味着 28708 的 close() 系统调用需要一些时间(大约 71 微秒),并且在此期间,不同的进程/线程启动了新的系统调用 - 28708 启动了 fcntl()。由于 strace 在此类调用完成之前无法报告返回值(或任何修改后的结构“输出”值),因此它将报告分为两部分:“未完成”的调用启动和“恢复”的调用完成。如前所述,这有 strace 输出交错系统调用报告。
猜你喜欢
  • 2019-04-02
  • 1970-01-01
  • 2010-11-14
  • 2012-05-26
  • 2023-03-23
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多