strace是什么?
linux syscall tracer(linux系统调用追踪器)
官网:strace是用于Linux的诊断、调试的用户空间追踪程序。
我认为他是一个用来看某一进程大概在干什么的工具。
strace能做什么?
官网:它可以用于监视和修改进程与Linux内核之间的交互,包括系统调用,信号传递和进程状态。
举个简单的例子:
1 |
|
编译运行发现报错“段错误”。
这个时候我们一般会gdb调试看看到底错在哪了,像这样:
但是这篇文章讲的是strace所以我们也可以这样:
我们通过两种方法都可以准确的找到问题:test文件夹是不存在的。
但是如果我们现在只有没有调试信息的二进制包呢?那strace显然更具优势。
而且如果我们在定位一个代码量十分庞大的问题时,在不明确问题具体出在哪片代码的时候,用gdb逐行去调,效率比较低下。
所以我们可以通过strace直接先跑一下定位到具体位置,如果没有解决我们在gdb仔细看。
OK,我们现在应该知道strace能做的是:打开应用进程的这个黑盒,通过系统调用的线索,告诉你进程大概在干嘛。
strace怎么用?
strace有两种运行模式:
- 通过它启动要跟踪的进程。
# strace ./a.out
- 通过进程号跟踪已经在运行的进程。
# strace -p 12345
strace用很多参数可以使用,可以通过man strace去仔细研究,这里我只讲一些我比较熟悉的参数:
1 | -tt 在每行输出的前面,显示微秒级别的时间。 |
首先我们看’-tt’和’-T’:
这里可以看到在每行输出的最前面多了时间,最后面多了花销的时间。
有了这两个参数我们就很容易找到进程哪里跑的慢了。
‘-v’:
客户的环境可能有自己的环境变量,不同的环境变量会导致进程调用的东西不一样,结果也可能不一样。
不要小看这个问题,经常会有客户遇到这种问题。
‘-f’:
这里我们换个例子:
1 |
|
多进程的程序如果只看父进程可能会忽略子进程,所以不要忘了加上-f
。
‘-e’:
继续文件操作的例子,
有时候strace输出的记录太多了,很难看,我们很难找到想要的记录,这时候只要加上-e
只看想看的就可以了。
‘-o’:
有时候strace输出的记录太多了,终端显示行数不够,导致看不全。
或者用脚本跑的时候人不在,我们就可以通过-o
输出到文本。
‘-s’:
默认只显示32个字节,但是我们要看的内容很长,可以通过-s
来多显示一点。
‘-p’:
就是通过pid查看正在运行的进程。
总结
综上所述我们可以通过strace解决很多系统调用问题,也能通过strace辅助我们调查问题。
虽然strace很强大,但是他解决不了只在用户态的问题,所以我们还是要好好学习gdb、perf等。
strace解决问题案例更新
进行中