`
shixiaomu
  • 浏览: 382876 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

strace 调试linux 程序

 
阅读更多
strace调试
2010-03-18 23:02

说明:本文档简要描述了strace的命令,在文末有本命令的基本应用。

strace - trace system calls and signals
usage: strace [-dffhiqrtttTvVxx] [-a column] [-e expr] ... [-o file]
              [-p pid] ... [-s strsize] [-u username] [-E var=val] ...
              [command [arg ...]]
   or: strace -c [-e expr] ... [-O overhead] [-S sortby] [-E var=val] ...
              [command [arg ...]]
   
1。 -c -- count time, calls, and errors for each syscall and report summary
为每个系统调用计算时间、调用、错误,并报告摘要

2。 -f -- follow forks, -ff -- with output into separate files
-f 跟踪fork的进程;-ff 把输出定向到独立的文件

3。 -F -- attempt to follow vforks, -h -- print help message
-F 尝试跟踪vfork的进程,当今平台与-f功能相同;-h 打印帮助信息

4。 -i -- print instruction pointer at time of syscall
在系统调用时,打印指令指针

5。 -q -- suppress messages about attaching, detaching, etc.
抑制附加、分离等信息

6。 -r -- print relative timestamp, -t -- absolute timestamp, -tt -- with usecs
-r 打印相对时间戳;-t 绝对时间戳;-tt 微秒

7。 -T -- print time spent in each syscall, -V -- print version
-T 打印每个系统调用的时间花费;-V 打印版本

8。 -v -- verbose mode: print unabbreviated argv, stat, termio[s], etc. args
-v 详细模式,打印非简略的参数、状态、termio[s]等

9。 -x -- print non-ascii strings in hex, -xx -- print all strings in hex
-x 打印非ascii的字符串为16进制;-xx 打印所有的字符串为16进制

10。-a column -- alignment COLUMN for printing syscall results (default 40)
对系统调用结果对齐列(默认为40列)

11。-e expr -- a qualifying expression: option=[!]all or option=[!]val1[,val2]...
    options: trace, abbrev, verbose, raw, signal, read, or write
在-e后附表达式。一个合格的表达式:选项=[!]所有 或者 选项=[!]值1[,值2]....;可选项:跟踪、缩写、冗长、原始的东东、信号、读、写。
  
12 -o file -- send trace output to FILE instead of stderr
发送跟踪输出到文件,而不是stderr

13。-O overhead -- set overhead for tracing syscalls to OVERHEAD usecs
设置跟踪系统调用的最大时间

14。-p pid -- trace process with process id PID, may be repeated
跟踪值为ID的进程,可以重复多个哦(注:最多32个)

15。-s strsize -- limit length of print strings to STRSIZE chars (default 32)
限制打印字符串的最大长度,默认为32字节

16。-S sortby -- sort syscall counts by: time, calls, name, nothing (default time)
排序,以系统调用过程中的时间、或者调用名等作为排序项。

17。-u username -- run command as username handling setuid and/or setgid
以其他用户名或者组名运行命令

18。-E var=val -- put var=val in the environment for command
设置环境变量

19。-E var -- remove var from the environment for command
清除环境变量

#################################################################################################
常见的使用方式有:
1。查看CPU运行时间
[guest@localhost tmp]$ strace -c ./b.out        
% time     seconds usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
42.72    0.000692          87         8           open
38.40    0.000622         622         1           set_thread_area
16.85    0.000273         137         2           munmap
   2.04    0.000033           5         7           read
   0.00    0.000000           0         8           close
   0.00    0.000000           0         1           execve
   0.00    0.000000           0         1           access
   0.00    0.000000           0         3           brk
   0.00    0.000000           0         4           mprotect
   0.00    0.000000           0        17           mmap2
   0.00    0.000000           0         7           fstat64
------ ----------- ----------- --------- --------- ----------------
100.00    0.001620                    59           total

2。查看相对运行时间
[guest@localhost tmp]$ strace -r ./b.out
0.000560 mprotect(0xb91000, 8192, PROT_READ) = 0
     0.000196 mprotect(0x45c000, 4096, PROT_READ) = 0
     0.000884 mprotect(0x42a000, 16384, PROT_READ) = 0
     0.000191 mprotect(0xa4a000, 4096, PROT_READ) = 0
     0.000144 munmap(0xb7f12000, 45307) = 0
     0.000577 brk(0)                    = 0x8c2b000
     0.000171 brk(0x8c4c000)            = 0x8c4c000
     0.000183 open("sleeper.cpp", O_RDONLY|O_LARGEFILE) = 3
     0.000225 read(3, "#include <unistd.h>\n#include <io"..., 8191) = 355
     0.000372 read(3, "", 8191)         = 0
     0.000298 close(3)                  = 0
     0.000192 exit_group(0)             = ?

3。查看文件变动相关的信号
[guest@localhost tmp]$ strace -e trace=desc ./b.out
open("/etc/ld.so.preload", O_RDONLY)    = 3
fstat64(3, {st_mode=S_IFREG|0444, st_size=17, ...}) = 0
close(3)                                = 0
open("/lib/libcwait.so", O_RDONLY)      = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20\3\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=2572, ...}) = 0
close(3)                                = 0
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=45307, ...}) = 0
close(3)                                = 0
open("/usr/lib/libstdc++.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0P\2348\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=936908, ...}) = 0
close(3)                                = 0
open("/lib/libm.so.6", O_RDONLY)        = 3

4。按调用过程来排序,并显示相对时间
guest@localhost tmp]$ strace -r -S calls ./b.out
     0.000000 execve("./b.out", ["./b.out"], [/* 20 vars */]) = 0
     0.001860 brk(0)                    = 0x86b4000
     0.000236 access("/etc/ld.so.preload", R_OK) = 0
     0.001263 open("/etc/ld.so.preload", O_RDONLY) = 3
     0.000497 fstat64(3, {st_mode=S_IFREG|0444, st_size=17, ...}) = 0
     0.000211 mmap2(NULL, 17, PROT_READ|PROT_WRITE, MAP_PRIVATE, 3, 0) = 0xb7ff3000
     0.000756 close(3)                  = 0
     0.000173 open("/lib/libcwait.so", O_RDONLY) = 3
     0.001096 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20\3\0\0004\0\0\0"..., 512) = 512
     0.000164 fstat64(3, {st_mode=S_IFREG|0755, st_size=2572, ...}) = 0
     0.000610 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7ff2000
     0.000165 mmap2(NULL, 5544, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x76d000
     0.000757 mmap2(0x76e000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x76e000
     0.000159 close(3)                  = 0
     0.000762 munmap(0xb7ff3000, 17)    = 0
     0.000160 open("/etc/ld.so.cache", O_RDONLY) = 3

5。调试vsftpd,其进程号为21712,在下例中-f参数对子进程也进行了跟踪。
[root@test1 ~]# strace -f -T -p 21712        
Process 21712 attached - interrupt to quit
注:此时从另外一终端访问ftp
accept(3, {sa_family=AF_INET, sin_port=htons(4138), sin_addr=inet_addr("192.168.203.137")}, [16]) = 0 <10.148879>
rt_sigprocmask(SIG_BLOCK, [CHLD], NULL, = 0 <0.000050>
rt_sigprocmask(SIG_BLOCK, [HUP], NULL, = 0 <0.000046>
clone(Process 21732 attached (waiting for parent)
Process 21732 resumed (parent 21712 ready)
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7fcd718) = 21732 <0.000514>
[pid 21712] close(0)                    = 0 <0.000046>
[pid 21712] rt_sigprocmask(SIG_UNBLOCK, [CHLD], NULL, = 0 <0.000049>
[pid 21712] rt_sigprocmask(SIG_UNBLOCK, [HUP], NULL, = 0 <0.000039>
[pid 21712] accept(3, <unfinished ...>
[pid 21732] close(3)                    = 0 <0.000055>
[pid 21732] dup2(0, 1)                  = 1 <0.000041>
[pid 21732] dup2(0, 2)                  = 2 <0.000040>
[pid 21732] getpeername(0, {sa_family=AF_INET, sin_port=htons(4138), sin_addr=inet_addr("192.168.203.137")}, [16]) = 0 <0.000046>
[pid 21732] getsockname(0, {sa_family=AF_INET, sin_port=htons(21), sin_addr=inet_addr("192.168.203.139")}, [16]) = 0 <0.000042>
[pid 21732] open("/etc/hosts.allow", O_RDONLY) = 3 <0.000065>
[pid 21732] fstat64(3, {st_mode=S_IFREG|0644, st_size=161, ...}) = 0 <0.000043>
[pid 21732] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fdc000 <0.000054>
[pid 21732] read(3, "#\n# hosts.allow\tThis file descri"..., 4096) = 161 <0.000102>
[pid 21732] read(3, "", 4096)           = 0 <0.000044>
[pid 21732] close(3)                    = 0 <0.000044>
[pid 21732] munmap(0xb7fdc000, 4096)    = 0 <0.000072>
[pid 21732] open("/etc/hosts.deny", O_RDONLY) = 3 <0.000050>
[pid 21732] fstat64(3, {st_mode=S_IFREG|0644, st_size=347, ...}) = 0 <0.000041>
.....................................

6。其他...
分享到:
评论

相关推荐

    嵌入式linux下移植strace调试应用程序工具源码

    总的来说,移植和使用`strace`是一个复杂但至关重要的任务,它能让你深入理解程序在嵌入式Linux环境下的行为,为系统的调试和优化提供强有力的支持。仔细阅读移植文档,遵循步骤,你将能够顺利地在你的设备上部署并...

    linux下的程序调试工具ltrace和strace终版.pdf

    Linux下的程序调试工具ltrace和strace终版 在 Linux 操作系统中,程序调试是非常重要的一步,对于程序的开发、测试和优化都起着至关重要的作用。在 Linux 中,有两种常用的程序调试工具:ltrace 和 strace。这两种...

    LINUX基本的程序调试技能及相关工具的使用,包括GDB(DDD)、Mtrace、strace

    通过学习和实践这些工具,开发者能够更好地理解和调试Linux环境下的程序,提高问题定位和解决的效率。Mtrace.doc、gdb.doc和strace.pdf文档应该包含了这些工具的详细使用方法和实例,建议仔细阅读并结合实际项目进行...

    linux下的程序调试工具ltrace和strace借鉴.pdf

    在Linux操作系统中,调试是开发过程中必不可少的一部分,用于找出程序中的错误和异常行为。ltrace和strace是两个强大的命令行工具,它们可以帮助开发者跟踪和理解程序运行时的行为。这两个工具都提供了对程序执行...

    linux的strace命令(详解)

    `strace` 是一款非常强大的调试工具,主要用于追踪和诊断Linux程序中的系统调用与信号。它可以帮助开发者深入了解程序执行过程中的底层行为,对于定位和解决复杂的系统级问题具有不可替代的作用。 #### 二、基本...

    Linux应用调试之strace命令详解

    在Linux系统中,strace是一个强大的工具,用于调试应用程序,尤其是当它们遇到与系统交互的问题时。strace通过跟踪进程的系统调用和接收到的信号,帮助开发者理解程序如何与操作系统交互。这个命令对于理解程序为何...

    linux编程调试详解

    总的来说,Linux编程调试详解中,不仅包含了对调试方法的详细说明,还通过strace这个工具展示了如何在实践中应用调试技术。通过阅读这部分内容,开发者能够了解到如何利用调试工具高效地进行问题定位和程序分析,为...

    Linux程序设计代码

    通过学习这些知识点,你将具备编写和调试Linux程序的能力。这份“Linux程序设计代码”资料很可能会包含示例代码、练习和解决方案,帮助你实践这些概念。不断练习和阅读优秀的开源项目,是提升Linux编程技能的...

    Linux for ARM 调试软件集

    4. **其他可能包含的调试工具**:除了上述软件,Linux调试软件集可能还包括GDB(GNU Debugger)、Strace、Lsof、Syslog等工具。GDB是C/C++程序的调试利器,可以通过源代码级别的控制来跟踪和调试程序。Strace和Lsof...

    Linux驱动程序调试的常用方法.pdf

    本文将介绍 Linux 驱动程序调试的常用方法,包括利用 printk、查看 OOP 消息、利用 strace、利用内核内置的 hacking 选项、利用 ioctl 方法、利用/proc 文件系统、使用 kgdb 等七种方法。 一、利用 printk printk ...

    linux下程序的编译及调试

    在Linux操作系统中,程序的开发通常涉及到编译和调试两个主要步骤。编译是将源代码转换成可执行文件的过程,而调试则是找出并修复程序错误的关键环节。...通过不断实践和学习,你将成为Linux程序开发的专家。

    Linux程序设计_严冰.zip

    《Linux程序设计》是浙江大学出版社出版的一本专为学习Linux程序设计的读者量身打造的教材,由严冰先生编著。这本书旨在帮助本科生、研究生、嵌入式工程技术人员以及Linux爱好者掌握Linux环境下进行程序开发的基本...

    Linux程序设计第四版.rar

    《Linux程序设计第四版》是深入理解Linux系统编程的经典之作,涵盖了从基本概念到高级技术的广泛内容。这本书旨在帮助开发者、系统管理员以及对Linux内核感兴趣的读者掌握编写高效、可靠的Linux程序所需的技能。 ...

    Linux程序设计第四版_源代码ch12

    在Linux程序设计领域,第四版的书籍通常会深入讲解如何在Linux操作系统环境下编写高效、可靠的程序。本资源“Linux程序设计第四版_源代码ch12”提供的正是该书第十二章的源代码,这对于学习者来说是极其宝贵的实践...

    Linux程序设计第四版_源代码(免积分)

    10. **调试与性能分析**:学会使用gdb进行程序调试,以及使用perf、strace等工具进行性能分析和调优。 通过这本书的源代码学习,读者可以亲手实践这些概念,逐步掌握Linux程序设计的精髓。每个章节的代码示例都是...

    基于Linux调试工具strace与gdb的常用命令总结

    总的来说,strace和gdb是Linux环境下强大的调试利器,它们可以帮助开发者深入理解程序行为,定位问题,优化性能,对于任何Linux开发者来说都是必备的技能。通过熟练掌握这些工具,可以大大提高软件开发和维护的效率...

    Linux程序设计(中文版).zip

    《Linux程序设计(原书第2版)》是学习Linux系统编程的重要教材,它深入浅出地介绍了在Linux环境下编写程序的各种技术与方法。这本书中文版的出现,为国内的读者提供了更方便的学习途径,避免了语言障碍,使得理解内容...

    linux 高级程序设计第三版源代码(杨宗德著)

    《Linux高级程序设计》是学习Linux系统编程的...同时,源码也提供了一个学习如何编写高效、可靠和可维护的Linux程序的实例。在学习过程中,建议结合书中的理论部分,逐个解析源码,实践并调试,以达到最佳的学习效果。

Global site tag (gtag.js) - Google Analytics