系统调用追踪工具strace

当我们想知道某个进程为什么突然卡了,或者是某个工具到底是如何实现的时候。strace就派上了用场。它能将程序的调用信息打印出来。

strace原理:

它的实现基础是ptrace系统调用。ptrace系统调用提供了一种方法来跟踪和控制进程的执行,它可以读取和修改进程地址空间中的内容,包括寄存器的值。ptrace主要用于实现断点调试和跟踪系统调用。

ptrace系统调用

1 #include <sys/ptrace.h>
2 int ptrace(int request, int pid, int addr, int data);

Ptrace 提供了一种父进程可以控制子进程运行,并可以检查和改变它的核心image。它主要用于实现断点调试。

一个被跟踪的进程运行中,在执行系统调用之前,内核会先检查当前进程是否处于被“跟踪”(traced)的状态。如果是的话,内核暂停当前进程并将控制权交给跟踪进程,使跟踪进程得以察看或者修改被跟踪进程的寄存器

在一个进程被跟踪之后,跟踪者进程会在某种意义上充当被跟踪进程的父进程(如使用ps命令就可以看到他们的父子关系),而子进程真正的父进程被保存在其task_struct结构的real_parent成员中。

当子进程产生系统调用时,就会被暂停,父进程会在每次调用wait()时得到子进程停止运行的通知,这时父进程就可以检测和修改子进程了,随后父进程可以让子进程继续运行。当父进程不想跟踪了,可以通过设置PTRACE_KILL标记来终止子进程的运行。也可以通过设置PTRACE_DETACH标记让子进程解除被跟踪,继续正常运行。
函数参数:

  1. request:用于选择一个操作。
  2. pid:目标进程即被跟踪进程的pid。
  3. addr用于修改和拷贝被跟踪进程的进程地址空间的数据。
  4. data功能同addr。

父进程跟踪一个进程的方式有两种:

  1. 调用fork(),然后子进程打上PTRACE_TRACEME标记,并执行exec。
  2. 父进程可以给自己打上PTRACE_ATTACH标记来跟踪一个已有进程。

所以我们看strace有两种用法,一个是strace直接加要运行的程序,一个是用-p指定一个正在运行的进程。

一个进程被跟踪后,他只要接收到一个信号(即使这个信号被设置为忽略)就会停止运行(SIGKILL除外),然后父进程会在每次调用wait()时得到子进程停止运行的通知,这时父进程就可以检测和修改子进程了,随后父进程可以让子进程继续运行。

当父进程不想跟踪了,可以通过设置PTRACE_KILL标记来终止子进程的运行。也可以通过设置PTRACE_DETACH标记让子进程解除被跟踪,继续正常运行。

strace用法:

最简单的用法其实就是trace后面直接跟着要执行的命令。比如:

1 strace ls -l

就能追踪到它的系统调用。

1 execve("/bin/ls", ["ls""-l"], [/* 22 vars */]) = 0
2 brk(0)                                  = 0x2073000
3 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fee98686000
4 access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
5 open("/etc/ld.so.cache", O_RDONLY)      = 3
6 .........

命令参数:

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

在linux中,很多性能查看命令都是通过读取/proc中的文件实现的。所以我们如果想学习它们的实现,就可以使用strace追踪,用-e筛选出open函数,就知道它读取了什么文件。比如mount命令。

01 strace -eopen mount
02 open("/etc/ld.so.cache", O_RDONLY)      = 3
03 open("/lib64/libblkid.so.1", O_RDONLY)  = 3
04 open("/lib64/libuuid.so.1", O_RDONLY)   = 3
05 open("/lib64/libselinux.so.1", O_RDONLY) = 3
06 open("/lib64/libsepol.so.1", O_RDONLY)  = 3
07 open("/lib64/libc.so.6", O_RDONLY)      = 3
08 open("/lib64/libdl.so.2", O_RDONLY)     = 3
09 open("/proc/filesystems", O_RDONLY)     = 3
10 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
11 open("/dev/null", O_RDWR)               = 3
12 <span style="color: #ff0000;"><strong>open("/etc/mtab", O_RDONLY)             = 3
13 </strong></span>

参考资料:

http://blog.csdn.net/sealyao/article/details/6710772

转载请注明:旅途@KryptosX » 系统调用追踪工具strace

时间: 2024-09-17 03:53:57

系统调用追踪工具strace的相关文章

自助Linux之问题诊断工具strace

引言 "Oops,系统挂死了..." "Oops,程序崩溃了..." "Oops,命令执行报错..."   对于维护人员来说,这样的悲剧每天都在上演.理想情况下,系统或应用程序的错误日志提供了足够全面的信息,通过查看相关日志,维护人员就能很快地定位出问题发生的原因.但现实情况,许多错误日志打印模凌两可,更多地描述了出错时的现象(比如"could not open file","connect to XXX time

自助Linux之问题诊断工具strace【转】

转自:http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html   引言 "Oops,系统挂死了..." "Oops,程序崩溃了..." "Oops,命令执行报错..."   对于维护人员来说,这样的悲剧每天都在上演.理想情况下,系统或应用程序的错误日志提供了足够全面的信息,通过查看相关日志,维护人员就能很快地定位出问题发生的原因.但现实情况,许多错误日志打印模凌两可,更多地

谷歌推新用户偏好追踪工具 替代第三方Cookies

中介交易 SEO诊断 淘宝客 云主机 技术大厅 网易科技讯 9月18日消息,据国外媒体报道,谷歌正在开发一种广告匿名标识符-AdID ,以此来替代跟踪用户上网浏览活动的第三方Cookie.这将彻底改变广告商的网络营销方式,将为这一价值1200亿美元的在线广告市场注入新的活力. 谷歌目前占据了全球在线广告收入的大约三分之一.作为最大的在线广告载体,会产生新的用户偏好追踪工具不足为奇.AdID每年都将被浏览器重置,用户也可以为敏感个人信息创建二级AdID.广告商只有在遵循AdID条款的情况下才能使用

MSS软件推出RFID条码追踪工具

条形码解决方案.设备及软件提供商MSS软件公司宣布推出一种称为RFID条码跟踪工具(RFID Barcode Tracking Kit)的移动RFID资产跟踪解决方案.除销售硬件和软件产品外,该公司还提供各种设备租赁. RFID条码跟踪工具可在MSS软件的网站上购买.该设备便捷性好,本质上是一个带有扫描功能的移动电脑,企业可携带该设备在不同位置处读取标签标记的物品. (MSS的RFID条码跟踪工具) 该设备可以根据企业需求进行定制和配置,以读取特定RFID标签及条码.此外,它可以读取远20英尺远

PHPLog php 程序调试追踪工具_php技巧

原理:     1.程序执行的过程中,在相应的地方记录你想要追踪的变量及调用栈和每次函数调用的参数,          把这些信息以一定的格式记录到文件,一个变量一行,具体数据格式请参看代码,这里不细讲.     2.现在有了每次记录变量时的所有信息(包括调用栈及参数),当你通过浏览器访问这个程序时, 这个程序会把整个文件读取分析,          在页面显示你的所有调试信息,并且它会动态ajax刷新,保持与你的调试同步.     画个图吧,要清晰得多.      BackTrace也就是调用

错误追踪工具 YouTrack 7.0 EAP build (26198)

YouTrack 6.5 (build 16981) 更新,本次版本主要是bug修复.发行说明 YouTrack是一个keyboard-centric的跟踪错误和问题的网络应用程序,节省您花在处理问题上的时间.你只需要执行两个简单的步骤: 1.在搜索框进行查询;2.在命令窗口进行修正 重要特性: 基于AJAX的用户界面在程序的任何地方都可使用"alt +ins"快捷键开启问题报告从JIRA 3.x中导入现有的项目与LDAP, OpenID以及JetBrains TeamCity集成支持

strace工具的实现原理【转】

转自:http://blog.csdn.net/jasonchen_gbd/article/details/44044539 版权声明:本文为博主原创文章,转载请附上原博链接.   目录(?)[-] ptrace系统调用 使用ptrace跟踪进程 常用的request strace工具的实现原理   strace是Linux系统下的一个用来跟踪系统调用的工具,它的实现基础是ptrace系统调用.使用strace工具可以跟踪一个程序执行过程中发生的系统调用. 我这里讲到的内容有一点点和mips体系

Linux系统中strace命令的使用教程

  在调试的时候,strace能帮助你追踪到一个程序所执行的系统调用.当你想知道程序和操作系统如何交互的时候,这是极其方便的,比如你想知道执行了哪些系统调用,并且以何种顺序执行. 这个简单而又强大的工具几乎在所有的Linux操作系统上可用,并且可被用来调试大量的程序. 命令用法 让我们看看strace命令如何追踪一个程序的执行情况. 最简单的形式,strace后面可以跟任何命令.它将列出许许多多的系统调用.一开始,我们并不能理解所有的输出,但是如果你正在寻找一些特殊的东西,那么你应该能从输出中发

手把手教你用 strace 诊断问题

早些年,如果你知道有个 strace 命令,就很牛了,而现在大家基本都知道 strace 了,如果你遇到性能问题求助别人,十有八九会建议你用 strace 挂上去看看,不过当你挂上去了,看着满屏翻滚的字符,却十有八九看不出个所以然.本文通过一个简单的案例,向你展示一下在用 strace 诊断问题时的一些套路.  如下真实案例,如有雷同,实属必然!让我们看一台高负载服务器的 top 结果: top 技巧:运行 top 时,按「1」打开 CPU 列表,按「shift+p」以 CPU 排序. 在本例中