Linux:系统调用 和 Strace
  LeahPL0BlrQo 2023年11月19日 25 0

1. 写在前面

本文主要介绍:Linux 下系统调用和 strace 工具概述;

公众号: 滑翔的纸飞机

2. 系统调用 和 Strace

当 Linux 上运行的应用程序/进程要使用 Linux 内核管理的资源时,如读取文件、创建进程等。应用程序进程向 Linux 内核发出系统调用,Linux 内核执行必要的操作,然后将控制权交还给调用程序。strace 工具提供了跟踪 Linux 系统调用的功能。

在 Linux 中创建文件时,我们只需运行一条命令,输入所需的文件名即可。看起来很简单,对吧?但在这个简单的任务下面,却涉及到许多系统调用。要想知道所有的系统调用,我们可以运行以下命令:

root@dev:~# strace touch test.txt
execve("/usr/bin/touch", ["touch", "test.txt"], 0x7fff904e9a98 /* 23 vars */) = 0
brk(NULL)                               = 0x55731c7a9000
... ...

执行上述命令后,我们将看到创建一个简单文件期间系统调用的大量信息。我们可以看到一个名为 "execve"的系统被调用,该系统调用将执行一个位于"/usr/bin/touch "目录下的程序。

2.1 查看运行进程的实时系统调用

要跟踪一个正在运行的进程所进行的系统调用,我们需要获取该进程的 PID。通过使用该特定进程的 PID,我们可以查看该进程进行的实时系统调用。让我们获取 "kube-proxy "进程的 PID:

root@dev:~#  pidof kube-proxy
----------------------------------------------------------------
25166

现在,我们可以使用 PID 查看 kube-proxy 进程实时的系统调用:

root@dev:~#  strace -p 25166
-------------------------------------------------------------------
strace: Process 25166 attached
epoll_pwait(4, [], 128, 0, NULL, 140720404847384) = 0
epoll_pwait(4, [], 128, 832, NULL, 140720404847448) = 0
epoll_pwait(4, [], 128, 0, NULL, 140720404847384) = 0
epoll_pwait(4, [], 128, 4999, NULL, 140720404847448) = 0
epoll_pwait(4, [], 128, 0, NULL, 140720404847384) = 0
epoll_pwait(4, [], 128, 4484, NULL, 140720404847448) = 0
getrandom("\x20\xa7\xb0\xd9\x16\x22\x76\x58", 8, 0) = 8
write(11, "\27\3\3\0\"Zl\25dan\2711i\361.K\215\343\207A>\327\5_xZ\370P:H\17"..., 39) = 39
.....

2.2 系统调用摘要

要查看一条命令的系统调用次数的完整摘要,请使用以下命令:

root@dev:~# strace -c touch test
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 37.20    0.000500          26        19           openat
 21.58    0.000290          13        22           mmap
 21.06    0.000283          12        22           close
 15.03    0.000202          11        18           fstat
  2.60    0.000035          11         3           read
  1.56    0.000021          21         1           utimensat
  0.97    0.000013          13         1           dup2
  0.00    0.000000           0         3           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         6           pread64
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         2         1 arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.001344                   103         2 total

2.3 检查某些系统调用

要检查某些系统调用,请运行以下命令:

root@dev:~# strace  -e  trace=read touch test1.txt 
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300A\2\0\0\0\0\0"..., 832) = 832
read(3, "# Locale name alias data base.\n#"..., 4096) = 2996
read(3, "", 4096)                       = 0
+++ exited with 0 +++

root@dev:~# strace -c -e  trace=read,close touch test2.txt 
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.000049           2        22           close
  0.00    0.000000           0         3           read
------ ----------- ----------- --------- --------- ----------------
100.00    0.000049                    25           total

感谢您花时间阅读文章

关注公众号不迷路

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月19日 0

暂无评论

推荐阅读
  6YY0QMPUXEwu   2023年12月10日   31   0   0 linux网卡
  Ex81gqy3LOX7   2023年12月07日   22   0   0 linux
  nIt0XG0acU8j   2023年12月11日   32   0   0 linuxhtop
  nIt0XG0acU8j   2023年12月09日   36   0   0 linuxsort