9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数

strace

  是Linux环境下的一款程序调试工具,用于检查一个应用程序所使用的系统调用以及它所接收的系统信息。strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字、参数、返回值和执行所消耗的时间等,是高级运维和开发人员排查问题的杀手铜。

strace命令的参数选项及说明

-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执行所跟踪的命令

排查Nginx403 forbidden错误

strace -tt -f /applicatton/nginx/sbin/nginx

https://blog.51cto.com/oldboy/1633952

只跟踪与文件操作有关的系统调用

strace -tt -f -e trace=file /application/nginx/sbin/nginx    #只跟综与文件操作有关的系统调用。

通过pid 跟踪进程

[[email protected] ~]# pgrep nginx

1884

7785

7786

7787

[[email protected] ~]# pstree -p 1884

nginx(1884)─┬─nginx(7785)

├─nginx(7786)

└─nginx(7787)

[[email protected] ~]# strace -tt -f -e trace=file -p 7785

strace: Process 7785 attached

跟踪系统调用统计

strace不仅能够追踪系统调用,使用选项-c还能对进程所有的系统调用做一个统计分析。

[[email protected] ~]# which nginx
/usr/bin/nginx
[[email protected] ~]# strace -c /usr/bin/nginx
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
22.33    0.001129           7       153        52 open
15.55    0.000786           6       123           close
10.80    0.000546           6        95           mmap
  8.53    0.000431          13        32           write
  7.66    0.000387          10        39           read
  6.47    0.000327           7        48           mprotect
  5.38    0.000272          12        22           munmap
  4.35    0.000220           3        87           fstat
  3.20    0.000162          32         5           nanosleep
  2.87    0.000145           8        19           socket
  2.67    0.000135           4        38           pread64
  2.29    0.000116          29         4         4 connect
  1.19    0.000060           4        15        15 bind
  1.03    0.000052           3        16         5 stat
  1.03    0.000052           9         6           getdents
  0.99    0.000050           3        15           setsockopt
  0.65    0.000033          11         3           openat
  0.63    0.000032           2        15           ioctl
  0.63    0.000032           5         6         6 mkdir
  0.47    0.000024           2        12           fcntl
  0.16    0.000008           8         1           statfs
  0.14    0.000007           7         1         1 readlink
  0.10    0.000005           5         1           epoll_create
  0.08    0.000004           2         2           rt_sigaction
  0.08    0.000004           2         2           uname
  0.08    0.000004           2         2           gettimeofday
  0.08    0.000004           4         1           futex
  0.06    0.000003           3         1           poll
  0.06    0.000003           3         1           lseek
  0.06    0.000003           2         2           getrlimit
  0.06    0.000003           3         1           getppid
  0.06    0.000003           3         1           sched_getaffinity
  0.04    0.000002           1         2           brk
  0.04    0.000002           2         1           rt_sigprocmask
  0.04    0.000002           2         1           getuid
  0.04    0.000002           2         1           arch_prctl
  0.04    0.000002           2         1           set_tid_address
  0.04    0.000002           2         1           set_robust_list
  0.02    0.000001           1         1           geteuid
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         1           execve
------ ----------- ----------- --------- --------- ----------------
100.00    0.005055                   779        84 total

上面的结果将清楚地告诉我们调用了哪些系统函数,调用的次数是多少,消耗了多少时间等信息,这对我们分析程序来说是非常有用的。

重定向输出。

strace -c -o tongji.log /application/nginx/sbin/nginx  #用 -o 选项将strace的结果输出到文件中

对系统调用进行计时

strace -T /application/nginx/sbin/ngirnx    #<=使用选项-T将每个系统调用所花费的时间打印出来,每个调用的时间花费在调用行最右边的尖括导里面。

小结:strace命令很适合处埋程序僵尸、命令执行报错等问题,如果从程序日志和系统日志中看不出问题出现的原因,则可以strace一下,也许会有答案,不过也需要使用者有足够的耐心去查看输出!

ltrace:跟踪进程调用库函数

ltrace 能够跟踪进程的库函数调用,它会显现出调用了哪个库函数,而 strace则是跟踪进程的每个系统调用。

ltrace命令的参数选项及说明

-c    统计库函数每次调用的时间,最后程序退出时打印摘要
-C    解码低级别名称(内核级)为用户级名称
-d    打印调试信息
-e expr    输出过滤器,通过表达式,可以过滤掉你不想要的输出
          -e printf  表示只查看printf函数调用
          -e !printf 表示查看除printf函数以外的所有函数调用
-f         跟踪子进程
-o filename   将ltrace的输出写入文件filename
-p pid     指定要跟踪的进程pid
-r         输出每一个调用的相对时间
-S         显示系统调用
-t         在输出中的每一行前加上时间信息。例如16:45:28
-tt        在输出中的每一行前加上时间信息,精确到微秒。例如11:18:59.759546
-ttt       在输出中的每一行前加上时间信息,精确到微秒,而且时间表示为UNIX时间截。例如1486111461.650434
-T          显示每次调用所花费的时间
-u username 以username的UID和GID执行所跟踪的命令

Itrace使用

ltrace的用法与strace非常相似,选项功能也是类似

[[email protected] ~]# ltrace /usr/bin/nginx

通过pid 跟踪进程调用库函数。

[[email protected] ~]# pgrep nginx

1884

7785

7786

7787

[[email protected] ~]# ltrace -p 1884

原文地址:https://www.cnblogs.com/fadewalk/p/10847068.html

时间: 2024-11-06 16:20:54

9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数的相关文章

C语言实现一个hello/hi的简单聊天程序并跟踪分析到系统调用

socket编程介绍 Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,可以用它们来开发TCP/IP网络上的应用程序. Socket接口设计者最先是将接口放在Unix操作系统里面的.如果了解Unix系统的输入和输出的话,就很容易了解Socket了.网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立.数据传输等操作都是通

linux strace-跟踪进程的系统调用或是信号产生情况,lstrace-跟踪己丑年调用库函数情况,进程跟踪调试命令

本工具可以用来做大多数排除,比如mount一个NFS,很慢,找不出原因,我们可以使用strace命令来跟中mount这个经常所有的调用过程. strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用. strace 显示这些调用的参数并返回符号形式的值.strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核. 下面记录几个常用 option . 1 -f -F选项告诉strace同时跟踪fork和vfork出来的进程 2 -o xxx.txt 输出到某个文件.

c 进程和系统调用

这一篇博客讲解进程和系统调用相关的知识 有这样一个场景,我需要输入一串文字,然后把我输入的文字加上一个本地的时间戳 保存在一个文件中,可以初步理解为一个备忘录也行 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 5 /** 6 * 获取一个当前时间 7 */ 8 char *now() { 9 time_t t; 10 time(&t); 11 return asctime(loc

实验作业:使gdb跟踪分析一个系统调用内核函数

实验作业:使gdb跟踪分析一个系统调用内核函数(我使用的是getuid) 20135313吴子怡.北京电子科技学院 [第一部分] 根据视频演示的步骤,先做第一部分,步骤如下 ①更新menu代码到最新版 ②在代码中加入C函数.汇编函数 ③在main函数中加入makeconfig ④make rootfs ⑤可以看到qemu中增加了我们先前添加的命令: ⑥分别执行新增的命令 [第二部分]gdb跟踪分析一个系统调用内核函数 ①进入gdb调试 ②设置断点,继续执行: ③相对应的得到这样的结果: ④查看我

进程隐藏系统调用

一.实验内容 实验3:Linux进程管理及其扩展 1.阅读并分析Linux内核源代码,了解进程控制块.进程队列等数据结构: 2. 实现一个系统调用,使得可以根据指定的参数隐藏进程,使用户无法使用ps或top观察到进程状态.具体要求如下: (1)实现系统调用int hide(pid_t pid, int on),在进程pid有效的前提下,如果on置1,进程被隐藏,用户无法通过ps或top观察到进程状态:如果on置0且此前为隐藏状态,则恢复正常状态. (2)考虑权限问题,只有根用户才能隐藏进程. (

0.11之路(六):创建进程1

进程0要做的第一件事就是作为父进程调用fork函数创建第一个子进程--进程1. 内核用last_pid来存放系统自开机以来累计的进程数,也将此变量用作新建进程的进程号.BTW,linux 0.11 的task[64]只有64项,最多只能同时运行64个进程.fork函数中有个很重要的函数叫 copy_process() 函数. 进程0依靠它完成对进程1的创建: 1) 为进程1创建task_struct,将进程0的task_struct的内容复制给进程1 2) 为进程1的task_struct.ts

linux下的 进程控制 以及常见的进程控制函数

进程控制: 1. 进程创建函数: fork(); 头文件: #include<sys/types.h> #include<unistd.h> 函数原型: pid_t fork(void); 函数返回值:0:表示此进程现在是子进程: -1:表示出错: 子进程ID号:(大于零的整数):表示现在此进程时父进程,接收到的ID号是子进程的ID号: 2.fork()返回-1(也就是进程创建出错的原因) 1.系统中拥有了太多的进程:超过了系统的限制:(系统级) 2.该用户有了太多的进程,超过了C

Linux系统编程——进程的控制:结束进程、等待进程结束

结束进程 首先,我们回顾一下 C 语言中 continue, break, return 的作用: continue: 结束本次循环 break: 跳出整个循环,或跳出 switch() 语句 return: 结束当前函数 而我们可以通过 exit() 或 _exit() 来结束当前进程. 所需头文件: #include <stdlib.h> void exit(int value); 功能: 结束调用此函数的进程. 参数: status:返回给父进程的参数(低 8 位有效),至于这个参数是多

进程加载进化史(进程加载与内存存贮管理)

http://blog.sina.com.cn/s/blog_6f5e19860102vlv0.html 存储管理的基本原理 内存管理方法 内存管理主要包括内存分配和回收.地址变换.内存扩充.内存共享和保护等功能. 下面主要介绍连续分配存储管理.覆盖与交换技术以及页式与段式存储管理等基本概念和原理. 1.连续分配存储管理方式 连续分配是指为一个用户程序分配连续的内存空间.连续分配有单一连续存储管理和分区式储管理两种方式. (1)单一连续存储管理 在这种管理方式 中,内存被分为两个区域:系统区和用