侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux strace命令教程:深入理解程序执行(附案例详解和注意事项)

strace是一款强大的Linux命令行工具,用于跟踪进程执行过程中的系统调用和接收到的信号。它主要用于调试应用程序和内核中的问题,也被广泛用于性能分析。

Linux strace命令介绍

strace(system trace的缩写)是Linux和类Unix操作系统中的一个调试工具,它可以帮助用户分析程序在运行时与Linux内核的交互情况。通过监控与跟踪系统调用、信号传递及输出这些信息,开发者可以了解程序的行为,诊断问题和进行性能分析。

Linux strace命令适用的Linux版本

strace几乎适用于所有Linux版本,但是如果在某些特定的Linux发行版中未预装此工具,可以使用以下命令进行安装:

# 基于apt的发行版(如Debian、Ubuntu、Raspbian、Kali Linux等)
sudo apt-get update && sudo apt-get install strace

# 基于yum的发行版(如RedHat,CentOS 7等)
sudo yum update && sudo yum install strace

# 基于dnf的发行版(如Fedora,CentOS 8等)
sudo dnf update && sudo dnf install strace

# 基于apk的发行版(如Alpine Linux)
sudo apk add --update strace

# 基于pacman的发行版(如Arch Linux)
sudo pacman -Syu && sudo pacman -S strace

# 基于zypper的发行版(如openSUSE)
sudo zypper ref && sudo zypper in strace

# 基于pkg的FreeBSD发行版
sudo pkg update && sudo pkg install strace

# 基于pkg的OS X/macOS发行版
brew update && brew install strace

Linux strace命令的基本语法

语法格式:

strace [选项] 命令 [命令选项和参数]
strace [选项] -p 进程ID

Linux strace命令的常用选项或参数说明

选项描述
-c统计每一系统调用的时间、调用次数和错误等信息
-f跟踪由fork调用所产生的子进程
-p跟踪指定的进程ID
-e trace=系统调用只跟踪指定的系统调用
-o 文件名将strace的输出写入指定的文件中
-t在输出的每一行前加上时间信息
-s strsize指定输出的字符串最大长度
-v输出更详细的信息

Linux strace命令实例详解

实例1:跟踪程序中的系统调用

跟踪一个简单程序如ls的系统调用。

[linux@bashcommandnotfound.cn ~]$ strace ls

实例2:跟踪程序并输出到文件

将跟踪信息输出到文件trace.txt中。

[linux@bashcommandnotfound.cn ~]$ strace -o trace.txt ls

实例3:跟踪特定系统调用

只跟踪openclose系统调用。

[linux@bashcommandnotfound.cn ~]$ strace -e trace=open,close ls

实例4:跟踪子进程的系统调用

跟踪ls命令,包括它创建的所有子进程。

[linux@bashcommandnotfound.cn ~]$ strace -f ls

实例5:跟踪特定进程

跟踪进程ID为1234的进程。

[linux@bashcommandnotfound.cn ~]$strace -p 1234

当然可以,下面是一些额外的strace命令实例,它们展示了strace在不同场景下的应用:

实例6:统计系统调用信息

打印一个程序的系统调用统计信息,例如ls

strace -c ls

这会在程序执行完毕后,输出每个系统调用的次数、错误次数、时间消耗等统计信息。

实例7:限制输出的字符串长度

限制输出的字符串参数的最大长度:

strace -s 100 ls

这会将strace输出中的字符串长度限制为最多100个字符,这有助于防止输出过于冗长。

实例8:跟踪网络相关的系统调用

只跟踪与网络通信相关的系统调用,例如使用wget下载文件:

strace -e trace=network wget http://example.com

这将会输出所有与网络通信相关的系统调用,如socketconnectrecvsend等。

实例9:跟踪文件I/O相关的系统调用

只跟踪与文件I/O操作相关的系统调用:

strace -e trace=file ls /tmp

这将会输出所有与文件操作相关的系统调用,如openreadwriteclose等。

实例10:跟踪信号交互

跟踪程序接收和发送的信号:

strace -e trace=signal kill -USR1 `pidof myprocess`

这将会输出所有与信号处理相关的系统调用,如rt_sigactionrt_sigprocmaskkill等。

实例11:实时显示时间戳

在输出中添加时间戳,以便知道每个系统调用发生的具体时间:

strace -tt ls

这会在每行输出前添加微秒级的时间戳。

实例12:跟踪内存相关的系统调用

只跟踪与内存管理相关的系统调用:

strace -e trace=memory ls

这将会输出所有与内存分配和释放相关的系统调用,如mmapmunmapbrk等。

实例13:以图形化方式显示跟踪信息

虽然strace本身不提供图形化界面,但你可以使用其他工具来处理strace的输出,例如使用strace-log-merge将多个strace日志合并,或者用strace-graph来生成调用图:

strace -o output.txt -ttT -ff myprogram
strace-graph < output.txt > graph.txt

这将生成一个图表,展现函数调用的层次关系。

注意事项和提示

  • 在使用-f-ff跟踪多线程程序时,输出可能会很快填满屏幕或文件,因此最好使用-o将输出重定向到文件中。
  • 使用-e选项可以更精细地控制哪些类型的系统调用被跟踪,这样可以减少不必要的输出并专注于特定的调试任务。
  • 跟踪生产环境中的进程可能会带来性能损失,因此在生产环境中使用strace时应谨慎,并确保了解潜在的影响。
  • 有些程序可能对strace的使用具有检测机制,会因为安全原因而改变它们的行为或直接退出。这种情况下,可能需要寻找其他调试手段。
0

评论区