strace工具
介绍
Strace是 Linux 环境下的一款 程序调试工具 , 用于检查一个应用程序所使用的系统调用以及它所接收的系统信息
交叉编译
源码地址:Index of /files/
解压编译:
tar xf strace-6.7.tar.xz
cd strace-6.7/
#配置使用的交叉编译工具
#FY平台AP侧使用aarch64-linux-gnu,CP侧使用arm-linux-gnueabihf
./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc
make
成果物strace位于./src目录下
命令使用说明
参数 | 描述 |
-c | 统计每一个系统调用所执行的时间、次数和出错的次数等 |
-d | 输出strace关于标准错误的调试信息 |
-f | 跟踪目标进程,以及目标进程创建的所有子进程 |
-ff | 如果提供-o filename,则将所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号 |
-i | 输出系统调用的入口指针 |
-q | 禁止输出关于脱离的消息 |
-r | 输出每一个系统调用的相对时间 |
-t | 在输出中的每一行前加上时间信息。例如16:45:28 |
-tt | 在输出中的每一行前加上时间信息,精确到微秒。例如11:18:59.759546端 |
-ttt | 在输出中的每一行前加上时间信息,精确到微秒,而且时间表示为UNIX时间戳。例如1486111461.650434 |
-T | 显示每次系统调用所花费的时间 |
-v | 对于某些相关调用,把完整的环境变量、文件stat结构等打印出来 |
-x | 以十六进制形式输出非标准字符率 |
-xx | 所有字符串以十六进制形式输出 |
-e expr | 输出过滤器,通过表达式,可以过滤掉你不想要的输出 expr是一个表达式,用于控制如何跟踪:[qualifier=][!][valuel[,value2].. 说明: ①qualifier 只能是trace、abbrev、verbose、raw、signal、read、write其中之一 ②value是用来限定的符号或数字 ③默认的qualifier是trace ④感叹号是否定符号 例如: -e open等价于-e trace=open,表示只跟踪open调用 而-e trace!=open表示跟踪除了open以外的其他调用 常见选项: -e trace=[set] 只跟踪指定的系统调用 -e trace=file 只跟踪与文件操作有关的系统调用 -e trace=process 只跟踪与进程控制有关的系统调用 -e trace-network 只跟踪与网络有关的系统调用 -e trace=signal 只跟踪与系统信号有关的系统调用 -e trace=desc 只跟踪与文件描述符有关的系统调用 -e trace=ipc 只跟踪与进程通信有关的系统调用 -e abbrev=[set] 设定strace输出的系统调用的结果集 -e raw=[set] 将指定的系统调用的参数以十六进制显示 -e signal=[set] 指定跟踪的系统信号 -e read=[set] 输出从指定文件中读出的数据 -e write=[set] 输出写入到指定文件中的数据 |
-o filename | 将strace的输出写入文件filename |
-p pid | 指定要跟踪的进程pid,要同时跟踪多个pid,重复多次p选项即可 |
-s strsize | 指定输出字符串的最大长度,默认32。并没有将文件名视为字符串,默认全部输出 |
-u username | 以usemame的UID和GID执行所跟踪的命令 |
procfs
介绍
参考链接:https://juejin.cn/post/7055321925463048228
mtrace
介绍
mtrace是GNU C库(glibc)中的一部分,用来跟踪glibc的标准分配内存函数如malloc,alloc…
使用方式
1) makefile编译选项添加-g -lmcheck选项
2) 在需要内存泄漏检查的代码的开始调用void mtrace(void) (在mcheck.h中有声明)。mtrace为malloc等函数安装hook, 用于记录内存分配信息。
在需要内存泄漏检查的代码的结束调用void muntrace(void)。注意: 一般情况下不要调用muntrace, 而让程序自然结束. 因为可能有些释放内存代码要到muntrace之后才运行
3) 配置内存检测日志文件输出到和执行文件相同的目录下
setenv("MALLOC_TRACE", "output", 1);
4)程序执行后将output文件导出查看日志信息
5)使用addr2line工具打印出具体内存泄漏位置