C++ strace时间戳的含义

C++ strace时间戳的含义,c++,linux,C++,Linux,当使用strace-T-tt-o outputfile myprogram时,输出如下 16:14:37.576804 write(1, "EFFEEFFFEFFGGEEFEEFECEEDB"..., 4096) = 4096 <0.000014> 16:14:37.577121 write(1, ",...,,,.\tDEDEEDEDEEBDEEFECECFBEE"..., 4096) = 4096 <0.000015> 16:1

当使用
strace-T-tt-o outputfile myprogram
时,输出如下

16:14:37.576804 write(1, "EFFEEFFFEFFGGEEFEEFECEEDB"..., 4096) = 4096 <0.000014>
16:14:37.577121 write(1, ",...,,,.\tDEDEEDEDEEBDEEFECECFBEE"..., 4096) = 4096 <0.000015>
16:14:37.577434 write(1, "66098\tT\t41\t....,.....,,,.,,,,..."..., 4096) = 4096 <0.000016>
16:14:37.576804写入(1,“effeffegeefeedb”…,4096)=4096
16:14:37.577121写入(1,“,…,,,。\tdededededeebdeefecececfbee”…,4096)=4096
16:14:37.577434写入(1,“66098\tT\t41\t…”

第一列是指系统调用的开始时间还是结束时间?正如给定的-T,最后一列显示为“显示在系统调用中花费的时间。这记录了每个系统调用开始和结束之间的时间差。”为什么它与两个写调用之间的时间差不同?作为前两个,
16:14:37.577121-16:14:37.576804=0.000317>0.000014

根据我刚才尝试的一个实验:

strace -t sleep 2
时间戳是系统调用开始的时间。(它显示了一个时间戳与前面的系统调用匹配的
nanosleep
,而不是2秒后的下一个系统调用。)


我不能确定时间上是否存在测量误差,但您不能期望在系统调用中花费的时间与时间戳的差异完全相同-您的进程必须在系统调用之间的用户空间中进行一些工作。

我刚刚调查过这一点,所以我想也许这条线值得重温一下

基于Git代码(d091f1a9e2中的头部),代码如下:

trace\u系统调用(struct tcb*tcp,unsigned int*sig)
{
如果(输入(tcp)){
int res=syscall\u输入解码(tcp);//打印-tt时间戳
[...]
syscall_entering_finish(tcp,res);//测量-T的第一个时间戳
返回res;
}否则{
结构timespec ts={};
int res=syscall\u exiting\u decode(tcp,&ts);//测量-T的第二个时间戳
如果(res!=0){
res=syscall\u exiting\u trace(tcp,&ts,res);//计算syscall持续时间的增量
}
系统调用退出完成(tcp);
返回res;
}
}
因此,总之,-t/-tt获取系统调用开始之前的时间,甚至在-t度量第一个时间戳之前(以便稍后计算持续时间)