迅为3399开发板Android系统-使用strace跟踪系统调用

1 什么是 strace
strace 常用来跟踪进程执行时的系统调用和所接收的信号。在 Linux 世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。
strace 可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
2 什么是系统调用
系统调用(英语:system call),又称为系统呼叫,指运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务。系统调用提供用户程序与操作系统之间的接口。操作系统的进程空间分为用户空间和内核空间:
 操作系统内核直接运行在硬件上,提供设备管理、内存管理、任务调度等功能。
 用户空间通过 API 请求内核空间的服务来完成其功能——内核提供给用户空间的这些 API, 就是系统调用
Linux 内核目前有 300 多个系统调用,详细的列表可以通过 syscalls 手册页查看。这些系统调用主要分为几类:
文件和设备访问类 比如 open/close/read/write/chmod 等
进程管理类 fork/clone/execve/exit/getpid 等
信号类 signal/sigaction/kill 等
内存管理 brk/mmap/mlock 等
进程间通信 IPC shmget/semget * 信号量,共享内存,消息队列等
网络通信 socket/connect/sendto/sendmsg 等
其他
查看系统调用帮助手册 man 2 函数名,例如下图所示:


3 strace 的应用场景
基于特定的系统调用或系统调用组进行过滤
通过统计特定系统调用的使用次数,所花费的时间,以及成功和错误的数量来分析系统调用的使用。
它跟踪发送到进程的信号。
通过 pid 附加到任何正在运行的进程。
调试性能问题,查看系统调用的频率,找出耗时的程序段
查看程序读取的是哪些文件从而定位比如配置文件加载错误问题
当程序出现“Out of memory”时被系统发出的 SIGKILL 信息所 kill
另外因为 strace 拿到的是系统调用相关信息,一般也即是 IO 操作信息,这个对于排查比如 cpu 占用 100%问题是无能为力的。这个时候就可以使用 GDB 工具了。

4 命令参数
我们输入以下命令,可以查看 strace 命令的参数。
strace -h
-c 统计每一系统调用的所执行的时间,次数和出错的次数等. -d 输出 strace 关于标准错误的调试信息. -f 跟踪由 fork 调用所产生的子进程. -ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的 filename.pid 中,pid 是各进程的进程号. -F 尝试跟踪 vfork 调用.在-f 时,vfork 不被跟踪. -h 输出简要的帮助信息. -i 输出系统调用的入口指针. -q 禁止输出关于脱离的消息. -r 打印出相对时间关于,,每一个系统调用. -t 在输出中的每一行前加上时间信息. -tt 在输出中的每一行前加上时间信息,微秒级. -ttt 微秒级输出,以秒了表示时间. -T 显示每一调用所耗的时间. -v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出. -V 输出 strace 的版本信息. -x 以十六进制形式输出非标准字符串
-xx 所有字符串以十六进制形式输出. -a column 设置返回值的输出位置.默认 为 40.

5 实用示例
1 跟踪已经在运行的进程,使用-p 选项能用在运行的进程上,输入以下命令:
strace -p 进程号
2 通过 strace 启动要跟踪的进程,./hello.sh 是要运行的文件,大家可以根据自己的需求自定义,如下所示:
strace ./hello.sh

posted @ 2021-10-09 13:35  心底狂像  阅读(91)  评论(0编辑  收藏  举报