使用strace -T -tt -o outputfile myprogram
时,输出就像
16:14:37.576804写(1,“EFFEEFFFEFFGGEEFEEFECEEDB”......,4096)= 4096< 0.000014> 16:14:37.577121 write(1,“,... ,,,。\ tDEDEEDEDEEBDEEFECECFBEE”......,4096)= 4096< 0.000015> 16:14:37.577434写(1,“66098 \ tT \ t41 \ t ...,..... ,,,。,,,, ......”......,4096)= 4096< 0.000016 >
第一列是指系统调用的开始时间还是结束时间?给定-T,最后一列给出为“显示在系统调用中花费的时间。这记录了每个系统调用的开始和结束之间的时间差。”为什么它与两个写调用之间的时间差不同?作为前两个,16:14:37.577121 - 16:14:37.576804 = 0.000317> 0.000014。
答案 0 :(得分:4)
根据我刚试过的一项实验:
strace -t sleep 2
时间戳是系统调用启动的时间。 (它显示一个nanosleep
,其时间戳与前面的系统调用相匹配,而不是下一个在2秒后加上时间戳的内容。)
我不能确定时间中没有一些测量不准确,但你不能指望在系统调用中花费的时间与时间戳的差异完全相同 - 你的过程必须做一些在系统调用之间的用户空间中工作。
答案 1 :(得分:0)
我刚刚对此进行了调查,所以我认为值得重振这个线程吧
基于Git代码(d091f1a9e2中为HEAD),代码如下:
trace_syscall(struct tcb *tcp, unsigned int *sig)
{
if (entering(tcp)) {
int res = syscall_entering_decode(tcp); // print the -tt timestamp
[...]
syscall_entering_finish(tcp, res); // measure the first timestamp for -T
return res;
} else {
struct timespec ts = {};
int res = syscall_exiting_decode(tcp, &ts); // measure second timestamp for -T
if (res != 0) {
res = syscall_exiting_trace(tcp, &ts, res); // calculate the delta for syscall duration
}
syscall_exiting_finish(tcp);
return res;
}
}
因此,总而言之,-t / -tt捕获了系统调用开始之前,甚至在-T测量第一个时间戳之前的时间(以便稍后计算持续时间)。