0
点赞
收藏
分享

微信扫一扫

系统调用捕获和分析—2-通过strace获取系统调用信息

本文为毕业设计过程中学习相关知识、动手实践记录下来的完整笔记,通过阅读本系列文章,您可以从零基础了解系统调用的底层原理并对系统调用进行拦截。由于本人能力有限,文章中可能会出现部分错误信息,如有错误欢迎指正。另外,本系列所有内容仅作为个人学习研究的笔记,转载请标明出处。感谢您的关注!


文章目录

  • ​​strace工具学习​​
  • ​​通过strace获取系统调用实验​​

strace工具学习

在linux操作系统中,应用程序执行时的进程不能直接访问底层硬件设备,只能通过系统调用的方式调用内核提供的接口,使得其从用户态转为内核态,达到访问硬件设备的目的。strace被设计用来跟踪进程执行时产生的系统调用及参数情况及、信号传递、系统调用返回的结果等信息。strace底层使用linux内核提供的ptrace系统调用,strace的框架结构图如下所示

系统调用捕获和分析—2-通过strace获取系统调用信息_守护进程

strace命令格式如下:

strace [-CdffhikqrtttTvVxxy] [-In] [-b execve] [-e expr]... [-a column] [-o file] [-s strsize] [-P path]... -p pid... / [-D] [-E var[=val]]... [-u username] command [args]

strace可以通过-e expr表达式选项来指定其根据用户的具体需要跟踪特定类型的系统调用,expr参数格式如下:

[qualifier=][!]value1[,value2]...

qualifier的值必须为trace, abbrev, verbose, raw, signal, read, write, 默认为trace
比如-e open等价于-e trace=open,意思是之跟踪open系统调用,-e trace=!open表示跟踪除了open之外的系统调用。
默认trace=all
即默认情况下直接使用strace跟踪全部系统调用

一些常用的跟踪过滤
-e trace=file 只跟踪和文件操作有关的系统调用
-e trace=process 只跟踪和进程控制有关的系统调用
-e trace=network 只跟踪和网络有关的系统调用
-e trace=ipc 只跟踪和进程通信的系统调用

通过strace获取系统调用实验

准备一个待跟踪的程序a.c

#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fp = fopen("./a.txt", "w");
fprintf(fp, "hello");
fclose(fp);
return 0;
}

编译后直接使用strace工具跟踪

gcc a.c -o a
strace ./a

删减后的结果如下

execve("./a", ["./a"], [/* 61 vars */]) = 0
brk(NULL) = 0x14ad000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=89641, ...}) = 0
mmap(NULL, 89641, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe3e4e66000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
...
open("./a.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
fstat(3, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
write(3, "hello", 5) = 5
close(3) = 0
exit_group(0) = ?
+++ exited with 0 +++

通过上面实验可以看出,strace可以跟踪进程产生的系统调用,并按顺序详细输出每个系统调用的名称、参数、和调用返回值。

虽然strace能够详细显示进程的系统调用相关信息,但是它本质上来讲是一个上层应用程序,对于守护进程并不能达到理想的效果,原因是strace只能跟踪到守护进程父进程正常退出期间的系统调用序列;当父进程退出后,如果守护进程还有新的系统调用,就不能被跟踪到了。


举报

相关推荐

0 条评论