关于strace

strace是用来跟踪系统调用的,这里只研究一个问题:

在一个系统调用返回之前,系统调用的参数是否会被显示出来。

 

测试1:

strace 跟踪的部分信息:

我们发现,系统调用nanosleep的第一个参数显示出来了,nanosleep的函数签名如下:

通过对该系统调用的了解,我们发现,第一个参数是要sleep多长时间,而且是const的,不会被修改,所以,在系统调用开始就确定了,所以可以直接显示出来,而第二个参数的含义是: 如果该系统调用因为接收到信号而被迫返回,则第二个参数为该系统调用还剩余的sleep的时间,这个时间只有到该系统调用完成才能确定的,所以,不能立即显示出来。

 

再举个例子吧:

比如connect系统调用:

上面是一个不存在的IP地址,所以连接不上的,导致connect阻塞,我们发现,在connect返回之前,我们已经知道3个参数信息(实际上一共也就3个参数),参数的显示能给我们很有用的信息(IP、Port)。

 

在比如poll系统调用:

跟踪结果:

poll的函数签名如下:

我们发现poll有3个参数,但是在poll返回之前,一个参数信息都没有给出,这是因为第一个参数的值需要等到poll返回才能确定,如果我们strace发现一个已经运行这的进程在poll时阻塞了,将很难知道是哪个文件描述符上阻塞的。

 

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据