strace
了解 strace 和 ltrace。这俩工具在你的程序运行失败、挂起甚至崩溃,而你却不知道为什么或你想对性能有个总体的认识的时候是非常有用的。注意 profile 参数(-c)和附加到一个运行的进程参数 (-p)。
示例
命令
strace -tt -T -v -f -e trace=file -o /data/log/strace.log -s 1024 -p 23489
参数
-tt 在每行输出的前面,显示毫秒级别的时间
-T 显示每次系统调用所花费的时间
-v 对于某些相关调用,把完整的环境变量,文件stat结构等打出来。
-f 跟踪目标进程,以及目标进程创建的所有子进程
-e 控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称
-o 把strace的输出单独写到指定的文件
-s 当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节
-p 指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可。
调试程序
strace -tt -f ./some_server ../conf/some_server.conf
调试一个已经运行的程序
获取nginx pid
pidof nginx
1111
追踪, 测试追踪效果,nginx -s reload
strace -p 1111
调试程序启动过程中加载的文件
这里的输出只显示和文件访问有关的内容,这是因为我们通过-e trace=file 选项指定了。
strace -tt -T -f -e trace=file -s 1024 -o output.log nginx -s reload
经验
天知道程序干了些什么导致无法启动或报错, 这个命令用来分析一些行为是非常有用的
比如, 无法程序启动缺少配置文件, 或者是没有权限, 但是程序没有明确提示, 这个时候就可以用strace追踪了
laravel 中的使用例子, 可以分析文件加载的先后顺序
strace -tt -T -f -e trace=file -s 1024 -o output.log php artisan list
当然这个用在swoole中的场景更多