写点什么

Linux 神器 strace 的使用方法及实践

发布于: 2020 年 08 月 11 日

在Linux系统中,strace命令是一个集诊断、调试、统计与一体的工具,可用来追踪调试程序,能够与其他命令搭配使用,接下来就Linux系统调用工具strace的使用方法和实践给大家做个详细介绍,一起来了解下strace的操作实例吧。



【场景】



1、在操作系统运维中会出现程序或系统命令运行失败,通过报错和日志无法定位问题根因。



2、如何在没有内核或程序代码的情况下查看系统调用的过程。



【说明】



1、strace是有用的诊断,说明和调试工具,Linux系统管理员可以在不需要源代码的情况下即可跟踪系统的调用。



2、strace显示有关进程的系统调用的信息,这可以帮助确定一个程序使用的哪个函数,当然在系统出现问题时可以使用 strace定位系统调用过程中失败的原因,这是定位系统问题的很好的方法。



【参数解析】



1. strace安装方法:



CentOS/EulerOS系统



# yum install strace



Ubuntu系统:



# apt-get install strace –y



2.strace的常用参数及示例



-c



统计每一系统调用的所执行的时间,次数和出错的次数等。



示例:打印执行uptime时系统系统调用的时间、次数、出错次数和syscall



# strace -c uptime



-d



显示有关标准错误的strace本身的一些调试输出。



-f



跟踪子进程,这些子进程是由于fork(2)系统调用而由当前跟踪的进程创建的。



-i

在系统调用时打印指令指针。



-t



跟踪的每一行都以时间为前缀。



-tt



如果给出两次,则打印时间将包括微秒。



-ttt



如果给定三次,则打印时间将包括微秒,并且前导部分将打印为自该**以来的秒数。



-T



显示花费在系统调用上的时间。这将记录每个系统调用的开始和结束之间的时间差。



-v



打印环境,统计信息,termios等调用的未缩写版本。这些结构在调用中非常常见,因此默认行为显示了结构成员的合理子集。使用此选项可获取所有详细信息。



-V



打印strace的版本号。



-e expr



限定表达式,用于修改要跟踪的事件或如何跟踪它们:



-e trace=set



仅跟踪指定的系统调用集。该-c选项用于确定哪些系统调用可能是跟踪有用有用。例如,trace=open,close,read,write表示仅跟踪这四个系统调用。



-e trace=file



跟踪所有以文件名作为参数的系统调用。



示例:打印执行ls时跟文件有关的系统调用。



# strace -e trace=file ls



-e trace=process



跟踪涉及过程管理的所有系统调用。这对于观察进程的派生,等待和执行步骤很有用。



-e trace=network



跟踪所有与网络相关的系统调用。



-e trace=signal



跟踪所有与信号相关的系统调用。



-e trace=ipc



跟踪所有与IPC相关的系统调用。



-o 文件名



将跟踪输出写入文件名而不是stderr。



-p pid



使用进程ID pid附加到该进程并开始跟踪。跟踪可以随时通过键盘中断信号(CTRL -C)终止。



-S



按指定条件对-c选项打印的直方图输出进行排序。



示例:打印执行uname系统调用中calls的次数排序



# strace -fc -S calls uname



注:其他参数可以查看man手册



# man strace



【使用实践】



以“定位一次系统无法解析域名故障”为例



【问题现象】:



无法访问外网域名,提示Name or service not know。



且已检查系统DNS配置文件/etc/resolv.conf正确,排除DNS解析失败。



【问题分析】:



当前无法确定系统在执行 解析域名失败的原因,这时候需要使用strace查看系统调用过程,域名解析通常跟系统读取文件相关,因此我们只查看open file的过程。具体命令如下:



# strace -e strace=open ping www.baidu.com





如上图所示在系统调用过程中出现/usr/lib64/libnss_dns.so.2文件缺失,则问题根因已确定为libnss_dns.so.2系统库文件缺失。



解决方法】:



libnss_dns.so.2文件由glibc-devel包产生,因此重新安装该包即可,请执行



# yum reinstall glibc-devel



点击关注,第一时间了解华为云新鲜技术~



发布于: 2020 年 08 月 11 日阅读数: 72
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
Linux神器strace的使用方法及实践