strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用

linux之strace命令跟踪进程的系统调用 1 系统调用 操作系统的进程空间分为用户空间和内核空间,操作系统内核直接运行在硬件上,提供设备管理、内存管理、任务调度等功能,我们用户空间不能直接调用,所以就有了系统调用(运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务),系统调用提供用户程序与操作系统之间的接口。用户空间通过API请求内核空间的服务来完成其功能——内核提供给用户空间的这些API, 就是系统调用。Linux内核目前有... 阅读详情


strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用。

strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。
下面记录几个常用 option . 
1 -f -F选项告诉strace同时跟踪fork和vfork出来的进程
2 -o xxx.txt 输出到某个文件。
3 -e execve 只记录 execve 这类系统调用 
—————————————————
进程无法启动,软件运行速度突然变慢,程序的\"SegmentFault\"等等都是让每个Unix系统用户头痛的问题,
本文通过三个实际案例演示如何使用truss、strace和ltrace这三个常用的调试工具来快速诊断软件的\"疑难杂症\"。 



truss和strace用来跟踪一个进程的系统调用或信号产生的情况,而 ltrace用来跟踪进程调用库函数的情况。truss是早期为System V R4开发的调试程序,包括Aix、FreeBSD在内的大部分Unix系统都自带了这个工具;
而strace最初是为SunOS系统编写的,ltrace最早出现在GNU/DebianLinux中。
这两个工具现在也已被移植到了大部分Unix系统中,大多数Linux发行版都自带了strace和ltrace,而FreeBSD也可通过Ports安装它们。


你不仅可以从命令行调试一个新开始的程序,也可以把truss、strace或ltrace绑定到一个已有的PID上来调试一个正在运行的程序。

三个调试工具的基本使用方法大体相同,下面仅介绍三者共有,而且是最常用的三个命令行参数:

-f :除了跟踪当前进程外,还跟踪其子进程。
-o file :将输出信息写到文件file中,而不是显示到标准错误输出(stderr)。
-p pid :绑定到一个由pid对应的正在运行的进程。此参数常用来调试后台进程。

使用上述三个参数基本上就可以完成大多数调试任务了,下面举几个命令行例子:
truss -o ls.truss ls -al: 跟踪ls -al的运行,将输出信息写到文件/tmp/ls.truss中。
strace -f -o vim.strace vim: 跟踪vim及其子进程的运行,将输出信息写到文件vim.strace。
ltrace -p 234: 跟踪一个pid为234的已经在运行的进程。

三个调试工具的输出结果格式也很相似,以strace为例:

brk(0) = 0×8062aa8
brk(0×8063000) = 0×8063000
mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0×92f) = 0×40016000


每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。 truss、strace和ltrace的工作原理大同小异,都是使用ptrace系统调用跟踪调试运行中的进程,详细原理不在本文讨论范围内,有兴趣可以参考它们的源代码。 
举两个实例演示如何利用这三个调试工具诊断软件的\"疑难杂症\":




案例一:运行clint出现Segment Fault错误

操作系统:FreeBSD-5.2.1-release
clint是一个C++静态源代码分析工具,通过Ports安装好之后,运行:

# clint foo.cpp
Segmentation fault (core dumped)
在Unix系统中遇见\"Segmentation Fault\"就像在MS Windows中弹出\"非法操作\"对话框一样令人讨厌。OK,我们用truss给clint\"把把脉\":

# truss -f -o clint.truss clint
Segmentation fault (core dumped)
# tail clint.truss
739: read(0×6,0×806f000,0×1000) = 4096 (0×1000)
739: fstat(6,0xbfbfe4d0) = 0 (0×0)
739: fcntl(0×6,0×3,0×0) = 4 (0×4)
739: fcntl(0×6,0×4,0×0) = 0 (0×0)
739: close(6) = 0 (0×0)
739: stat(\"/root/.clint/plugins\",0xbfbfe680) ERR#2 'No such file or directory'
SIGNAL 11
SIGNAL 11
Process stopped because of: 16
process exit, rval = 139
我们用truss跟踪clint的系统调用执行情况,并把结果输出到文件clint.truss,然后用tail查看最后几行。
注意看clint执行的最后一条系统调用(倒数第五行):stat(\"/root/.clint/plugins\",0xbfbfe680) ERR#2 'No such file or directory',问题就出在这里:clint找不到目录\"/root/.clint/plugins\",从而引发了段错误。怎 样解决? 很简单: mkdir -p /root/.clint/plugins,不过这次运行clint还是会\"Segmentation Fault\"9。继续用truss跟踪,发现clint还需要这个目录\"/root/.clint/plugins/python\",建好这个目录 后 clint终于能够正常运行了。 




案例二:vim启动速度明显变慢

操作系统:FreeBSD-5.2.1-release
vim版本为6.2.154,从命令行运行vim后,要等待近半分钟才能进入编辑界面,而且没有任何错误输出。仔细检查了.vimrc和所有的vim脚 本都没有错误配置,在网上也找不到类似问题的解决办法,难不成要hacking source code?没有必要,用truss就能找到问题所在:

# truss -f -D -o vim.truss vim

这里-D参数的作用是:在每行输出前加上相对时间戳,即每执行一条系统调用所耗费的时间。我们只要关注哪些系统调用耗费的时间比较长就可以了,用less仔细查看输出文件vim.truss,很快就找到了疑点:

735: 0.000021511 socket(0×2,0×1,0×0) = 4 (0×4)
735: 0.000014248 setsockopt(0×4,0×6,0×1,0xbfbfe3c8,0×4) = 0 (0×0)
735: 0.000013688 setsockopt(0×4,0xffff,0×8,0xbfbfe2ec,0×4) = 0 (0×0)
735: 0.000203657 connect(0×4,{ AF_INET 10.57.18.27:6000 },16) ERR#61 'Connection refused'
735: 0.000017042 close(4) = 0 (0×0)
735: 1.009366553 nanosleep(0xbfbfe468,0xbfbfe460) = 0 (0×0)
735: 0.000019556 socket(0×2,0×1,0×0) = 4 (0×4)
735: 0.000013409 setsockopt(0×4,0×6,0×1,0xbfbfe3c8,0×4) = 0 (0×0)
735: 0.000013130 setsockopt(0×4,0xffff,0×8,0xbfbfe2ec,0×4) = 0 (0×0)
735: 0.000272102 connect(0×4,{ AF_INET 10.57.18.27:6000 },16) ERR#61 'Connection refused'
735: 0.000015924 close(4) = 0 (0×0)
735: 1.009338338 nanosleep(0xbfbfe468,0xbfbfe460) = 0 (0×0)

vim试图连接10.57.18.27这台主机的6000端口(第四行的connect()),连接失败后,睡眠一秒钟继续重试(第6行的 nanosleep())。以上片断循环出现了十几次,每次都要耗费一秒多钟的时间,这就是vim明显变慢的原因。可是,你肯定会纳闷:\"vim怎么会 无 缘无故连接其它计算机的6000端口呢?\"。问得好,那么请你回想一下6000是什么服务的端口?没错,就是X Server。看来vim是要把输出定向到一个远程X Server,那么Shell中肯定定义了DISPLAY变量,查看.cshrc,果然有这么一行:setenv DISPLAY ${REMOTEHOST}:0,把它注释掉,再重新登录,问题就解决了。




案例三:用调试工具掌握软件的工作原理

操作系统:Red Hat Linux 9.0
用调试工具实时跟踪软件的运行情况不仅是诊断软件\"疑难杂症\"的有效的手段,也可帮助我们理清软件的\"脉络\",即快速掌握软件的运行流程和工作 原理,不 失为一种学习源代码的辅助方法。下面这个案例展现了如何使用strace通过跟踪别的软件来\"触发灵感\",从而解决软件开发中的难题的。
大家都知道,在进程内打开一个文件,都有唯一一个文件描述符(fd:file descriptor)与这个文件对应。而本人在开发一个软件过程中遇到这样一个问题:
已知一个fd,如何获取这个fd所对应文件的完整路径?不管是Linux、FreeBSD或是其它Unix系统都没有提供这样的API,怎么办呢?我们 换个角度思考:Unix下有没有什么软件可以获取进程打开了哪些文件?如果你经验足够丰富,很容易想到lsof,使用它既可以知道进程打开了哪些文件,也 可以了解一个文件被哪个进程打开。好,我们用一个小程序来试验一下lsof,看它是如何获取进程打开了哪些文件。lsof: 显示进程打开的文件。

/* testlsof.c */
#include #include #include #include #include 
int main(void)
{
open(\"/tmp/foo\", O_CREAT|O_RDONLY); /* 打开文件/tmp/foo */
sleep(1200); /* 睡眠1200秒,以便进行后续操作 */
return 0;
}

将testlsof放入后台运行,其pid为3125。命令lsof -p 3125查看进程3125打开了哪些文件,我们用strace跟踪lsof的运行,输出结果保存在lsof.strace中:

# gcc testlsof.c -o testlsof
# ./testlsof &
[1] 3125
# strace -o lsof.strace lsof -p 3125

我们以\"/tmp/foo\"为关键字搜索输出文件lsof.strace,结果只有一条:


# grep '/tmp/foo' lsof.strace
readlink(\"/proc/3125/fd/3\", \"/tmp/foo\", 4096) = 8

原来lsof巧妙的利用了/proc/nnnn/fd/目录(nnnn为pid):Linux内核会为每一个进程在/proc/建立一个以其pid为名 的目录用来保存进程的相关信息,而其子目录fd保存的是该进程打开的所有文件的fd。目标离我们很近了。好,我们到/proc/3125/fd/看个究 竟:

# cd /proc/3125/fd/
# ls -l
total 0
lrwx—— 1 root root 64 Nov 5 09:50 0 -> /dev/pts/0
lrwx—— 1 root root 64 Nov 5 09:50 1 -> /dev/pts/0
lrwx—— 1 root root 64 Nov 5 09:50 2 -> /dev/pts/0
lr-x—— 1 root root 64 Nov 5 09:50 3 -> /tmp/foo
# readlink /proc/3125/fd/3
/tmp/foo

答案已经很明显了:/proc/nnnn/fd/目录下的每一个fd文件都是符号链接,而此链接就指向被该进程打开的一个文件。我们只要用readlink()系统调用就可以获取某个fd对应的文件了,代码如下:


#include #include #include #include #include #include 
int get_pathname_from_fd(int fd, char pathname[], int n)
{
char buf[1024];
pid_t pid;
bzero(buf, 1024);
pid = getpid();
snprintf(buf, 1024, \"/proc/%i/fd/%i\", pid, fd);
return readlink(buf, pathname, n);
}
int main(void)
{
int fd;
char pathname[4096];
bzero(pathname, 4096);
fd = open(\"/tmp/foo\", O_CREAT|O_RDONLY);
get_pathname_from_fd(fd, pathname, 4096);
printf(\"fd=%d; pathname=%sn\", fd, pathname);
return 0;
}

出于安全方面的考虑,在FreeBSD 5 之后系统默认已经不再自动装载proc文件系统,因此,要想使用truss或strace跟踪程序,你必须手工装载proc文件系统:mount -t procfs proc /proc;或者在/etc/fstab中加上一行:

深入掌握Linux系统调用:strace命令实战 strace是一款在Linux系统中广泛使用的诊断工具,它通过监控和记录系统调用及接收到的信号来帮助开发者或系统管理员理解和诊断进程执行过程中的问题。这一命令对于理解系统底层运作、调试程序以及性能优化都有着举足轻重的作用。strace可以监视的活动包括进程接收的信号、进程执行的系统调用以及系统调用的返回值。这意味着它能够展示出程序运行期间实际与操作系统的交互细节,为开发者提供了一个强大的诊断和问题分析手段。无论是对底层系统调用细节的好奇,还是针对应用程序运行的性能瓶颈进行调查,strace。 阅读详情

相关推荐

linux的strace命令(详解)

linux的strace命令(详解) strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用。 strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。

Linux应用调试之使用strace命令跟踪系统调用

Linux应用调试之使用strace命令跟踪系统调用

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 1426

5个企业级SOC平台横向对比:IBM QRadar vs Splunk vs 奇安信NGSOC

本文深度对比了IBM QRadar、Splunk和奇安信NGSOC等五大企业级SOC平台的核心能力,从架构设计、威胁检测、运营效率、成本模型和行业适配度五个维度进行解析。文章特别强调安全运营中心(SOC)在现代企业中的关键作用,并提供了实战数据和优化建议,帮助企业选择最适合自身需求的SOC解决方案。

a1b2c的博客 663

strace使用详解(转)

 (一) strace 命令     用途:打印 STREAMS 跟踪消息。  语法:strace [ mid sid level ] ...  描述:没有参数的 strace 命令将所有的驱动程序和模块中的所有 STREAMS 事件跟踪消息写到它的标准输出中。 这些消息是从STREAMS日志驱动程序中获取的。如果提供参数,它们必须是在三元组中。每个三元组表明跟踪消息要从给定的模块或驱动程序、

barsdy的专栏 1409

DaVinci Developer中枚举类型变量的创建与实战应用

本文详细介绍了在DaVinci Developer中创建和使用枚举类型变量的方法与实战应用。通过智能温控系统的案例,阐述了枚举类型在嵌入式开发中的核心价值,包括提升代码可读性、类型安全性和维护便捷性。文章还提供了枚举类型在状态机实现和多模块协同中的高级应用技巧,以及调试与优化的实用建议。

ik678901234的博客 511

使用openMVS对样例数据进行重建

openMVS根据github上的步骤进行编译。注意,如果没有GPU,用不了CUDA的话,那么需要在openMVS目录下找到CmakeLists.txt文件,把CUDA设置为OFF: SET(OpenMVS_USE_CUDA OFF CACHE BOOL "Enable CUDA library") 可执行的文件生成在openMVS_build/bin/里面,在openMVS_build文件夹下打开终端,按照顺序执行如下命令即可逐步重建。其中,-w 设置的是数据的总路径,-i 后接输入的文件名,-o

YuhsiHu的博客 2885

【Linux】运行程序前加上strace,可以追踪到函数库调用过程

如执行结果可知: 我们的程序虽然只有一个printf函数,但是在执行过程中,我们前后调用了execve、access、open、fstat、mmap、brk、write等系统调用。其中write系统调用会把字符串:yikoulinux通过设备文件1,发送到驱动,该设备节点对应终端stdout。【注意】运行程序前加上strace,可以追踪到函数库调用过程。

smartvxworks的博客 3811

408王道考研【数据结构】思维导图(章节详细可下载xmind文件)

由于图片太多,不一一放上来了,还有部分章节【查找、排序、B树B+树等】在百度网盘,可以关注我的公众号领取【完整的图片+xmind文件】,如想要获取xmind文件的同学可以关注我的个人公众号“小柒很爱喵”,回复“数据结构导图”,可获得以上导图原图和xmind文件(可修改导图内容、查看导图隐藏的笔记与备注,即上图带杠杠的地方是我进一步助于理解的解释)。 希望对你们...

weixin_41950078的博客 7985

实验 UNIX/LINUX及其使用环境(课后自学完成)

 实验  UNIX/LINUX及其使用环境(课后自学完成)(一)UNIX常用命令简介 实验目的1、了解UNIX的命令及使用格式。2、熟悉UNIX/LINUX的常用基本命令。 实验内容1、通过WINDOWS操作系统中的远程登录程序telnet.exe 登录UNIX。2、熟悉UNIX/LINUX的常用基本命令如ls、who、w、pwd、ps、pstree、top

zzpeng0803的专栏 1335

细说VLAN之untag和tag

一、拓扑图 先给出上面拓扑图的结论,后面再详细讲解: 结论:只有PC1与PC4之间能相互通信,除此之外,所有PC之间均不能通信,比如PC1与PC3不能建立通信。 针对Ping命令的一个知识: 要想ping通某台主机,必须满足两个条件: 1,源主机的ICMP请求包必须能达到目的主机。 2,目的主机的ICMP应答包必须能回到源主机。 二、理论基础 端口的出...

NoobMaster的博客 3万+

Cesium 实战 26 - 自定义纹理材质 - 箭头流动线(图片纹理)

Cesium 实战 - 自定义纹理材质 - 箭头流动线(图片纹理)。

非科班Java出身GISer的博客 1401

linux的strace命令

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

深度Java 9631

《唤醒你的AI同事:WorkBuddy从零上手》000:介绍及目录

《唤醒你的AI同事:WorkBuddy从零上手》全书导览与总目录:000–043 共 44 篇,覆盖从环境搭建、对话基础到资料库、行业助手与多模态生成的入门实战。含完整篇目速查与编号直达,建议关注收藏。

LuckyHanMo的博客 588

strace命令

strace linux 下程序的系统调用和信号调用跟踪工具 strace 简介 strace 命令是一种强大的工具, 能够显示任何由用户空间程式发出的系统调用. strace 显示这些调用的参数并返回符号形式的值. strace 从内核接收信息, 而且无需以任何特别的方式来构建内核. strace 的每一行输出包括系统调用名称, 然后是参数和返回值.   strace -f se...

weixin_33787529的博客 196

【异常】Warp终端AI功能403封禁报错I‘m sorry, I couldn‘t complete that request.Request failed with error: ErrorSta

本文针对Warp终端出现的AI功能定向封禁报错,完整还原脱敏后的报错信息、深度解读报错本质,并提供分优先级的全流程可落地解决方案,可直接用于技术排查、内部知识库归档。

奶爸的编程之路,也就一周冷个三天 265

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Strace:深入系统调用的强大调试工具

Strace:深入系统调用的强大调试工具

虽非技冠群英首,愿与同道共长歌; 大鹏一日同风起,扶摇直上九万里; 1146

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【strace命令详解:Linux下的强大跟踪工具 】

🌈你好呀!我是 山顶风景独好 🎈欢迎踏入我的博客世界,能与您在此邂逅,真是缘分使然!😊 🌸愿您在此停留的每一刻,都沐浴在轻松愉悦的氛围中。 📖这里不仅有丰富的知识和趣味横生的内容等您来探索,更是一个自由交流的平台,期待您留下独特的思考与见解。🌟 🚀让我们一起踏上这段探索与成长的旅程,携手挖掘更多可能,共同进步!💪✨

种一棵树,最好的时间是十年前,其次是现在。 1592

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

强大的strace命令用法详解

strace是什么? 按照strace官网的描述, strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。 strace底层使用内核的ptrace特性来实现其功能。 在运维的日常工作中,故障处理和问题诊断是个主要的内容,也是必备的技能。strace作为一种动态跟踪工具,能够帮助运维高效地定位进程和服务故障。它像是一个侦探,通过系统调用的蛛丝马迹,告诉你异常的真相。 strace能做什么? 运维工程师都

Lansonli(蓝深李)的博客 1862

Linux 编程与调试工具 strace:系统调用追踪

在 Linux 系统中,程序与操作系统之间的交互通过系统调用进行。这些系统调用提供了程序访问硬件、文件系统和其他操作系统资源的方式。当开发者遇到程序异常行为、性能瓶颈或者错误时,理解系统调用的过程至关重要。`strace` 是一个非常有用的工具,它可以追踪程序在运行过程中发出的所有系统调用,并将其详细信息输出,帮助开发者深入分析程序的行为。本文将介绍 `strace` 的基本概念、常见用法以及如何使用 `strace` 进行调试和故障排查。

1347

Linux调试工具:用于跟踪程序执行时的系统调用和接收到的信号的命令行工具strace

strace 是Linux系统上一款强大的命令行工具,用于跟踪程序执行时的系统调用和接收到的信号。它主要用于诊断、调试和性能分析。strace能够接管被跟踪进程执行的系统调用和收到的信号,然后把每一个执行的系统调用的名字、参数和返回值打印出来。通过strace,可以找到问题出现在用户层还是内核层,并显示这些调用的参数及返回符号形式的值。它从内核接收信息,而且不需要以任何特殊的方式来构建内核。以显示程序在执行过程中所进行的所有系统调用,以及它们的参数、返回值和失败时的错误码。可得到系统调用的统计信息。

weixin_70208651的博客 1644

【linux经典工具】strace-就十分钟你也能成为性能调优专家

strace是一款功能强大的 Linux 进程监控和诊断工具。主要作用就是:用于调试程序、解决问题、拦截和记录系统调用以及跟踪正在运行的进程。它能输出了程序如何与系统交互的过程,尤其是在无法获取源代码的情况下(那些开源工具、系统命令的调试就显得尤为重要了)。它还可以作为调试工具,帮助解决问题。它主要用于以下目的:1)调试程序2)故障、排除程序3)拦截进程的系统调用4)记录进程的系统调用5)进程接收到的信号6)跟踪正在运行的进程如果没有源代码,可以使用strace。

神技圈子的博客 3933

strace vs ltrace vs bpftrace:Linux系统调用监控工具选型指南(2024版)

本文深入对比了Linux系统调用监控三大工具strace、ltrace和bpftrace的核心原理与适用场景。strace基于ptrace,擅长细粒度追踪系统调用,但开销大;ltrace聚焦用户空间库函数;而基于eBPF的bpftrace则以极低开销实现全栈监控,是生产环境长期观测的理想选择。文章提供了清晰的选型决策矩阵,帮助技术人员根据调试阶段、问题类型和环境约束做出高效选择。

rust6ferris的博客 1081

strace 哇,好多系统调用

我不敢在没有认真考虑后果的情况下在生产环境中运行 strace(1),而是首先尝试它的替代品。尽管广为人知的是(并且不断被重新发现)strace 是一个神奇的工具,但少得多的人知道的是,它目前是 — 且一直以来都是 — 很危险的。 strace 是 Linux 的系统调用追踪器。它当前使用了神秘的 ptrace() (进程追踪)调试接口,后者以一种很暴力的方式运作:每次系统调用都暂停目标进程以使得调试器可以读取状态。且执行两次:系统调用开始时一次,结束时一次。 这意味着每次系统调用 strace 都暂停你的

tq08g2z的专栏 1808

Linux strace命令介绍

Linux strace命令介绍

峰爸的博客 1701

strace如何查看多线程的系统调用

strace如何查看多线程的系统调用

三问Linux社区 1055
上一篇: linux kernel startup process!
下一篇: insmod: error inserting 'hello.ko': -1 Invalid module format
bamboolsu
博客等级 码龄22年 200粉丝 394原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值