linux程序调试命令strace

strace命令用法详解:

strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

strace常用参数:

-p	跟踪指定的进程
-f	跟踪由fork子进程系统调用
-F	尝试跟踪vfork子进程系统调吸入,与-f同时出现时, vfork不被跟踪
-o      filename 默认strace将结果输出到stdout。通过-o可以将输出写入到filename文件中
-ff	常与-o选项一起使用,不同进程(子进程)产生的系统调用输出到filename.PID文件
-r	打印每一个系统调用的相对时间
-t	在输出中的每一行前加上时间信息。 -tt 时间确定到微秒级。还可以使用-ttt打印相对时间
-v	输出所有系统调用。默认情况下,一些频繁调用的系统调用不会输出
-s	指定每一行输出字符串的长度,默认是32。文件名一直全部输出
-c	统计每种系统调用所执行的时间,调用次数,出错次数。
-e	expr	输出过滤器,通过表达式,可以过滤出掉你不想要输出

命令实例:

[[email protected] ~]# strace cat /dev/null
execve("/bin/cat", ["cat", "/dev/null"], [/* 26 vars */]) = 0
brk(0)                                  = 0x24ef000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b8443faf000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=70314, ...}) = 0
mmap(NULL, 70314, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b8443fb0000
close(3)                                = 0
open("/lib64/libc.so.6", O_RDONLY)      = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360\355A\2428\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1979000, ...}) = 0
mmap(0x38a2400000, 3803304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x38a2400000
mprotect(0x38a2597000, 2097152, PROT_NONE) = 0
mmap(0x38a2797000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x197000) = 0x38a2797000
mmap(0x38a279c000, 18600, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x38a279c000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b8443fc2000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b8443fc3000
arch_prctl(ARCH_SET_FS, 0x2b8443fc2b20) = 0
mprotect(0x38a2797000, 16384, PROT_READ) = 0
mprotect(0x38a1e1f000, 4096, PROT_READ) = 0
munmap(0x2b8443fb0000, 70314)           = 0
brk(0)                                  = 0x24ef000
brk(0x2510000)                          = 0x2510000
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=99158704, ...}) = 0
mmap(NULL, 99158704, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b8443fc4000
close(3)                                = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
open("/dev/null", O_RDONLY)             = 3
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
read(3, "", 32768)                      = 0
close(3)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?

每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。
strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。  

通用的完整用法:

strace -o output.txt -T -tt -e trace=all -p 28979

上面的含义是 跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面。

2.在umount挂载目录时,直接卡住了,最后用 strace df -Th分析后结果挂载出问题了

strace df -Th

3.用strace跟踪 whoami的输出:

strace -o whoami-strace.txt whoami

  

参考文档:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html

时间: 2024-11-03 22:34:09

linux程序调试命令strace的相关文章

程序调试命令gdb

锁定线程 set scheduler-locking 1.要使用此命令,先用gcc -g编译程序,如:  $gcc -g test.c -o test  编译test.c源程序,输入此程序的调试版本test 2.调试程序  $gdb test //调试可执行程序test  $(gdb)start //使用程序test开始运行    列出指定函数的源代码,或列出指定行号开始的源程序  $(gdb)list 函数名  $(gdb)list 行号    backtrace(或bt) 查看各级函数调用及

LInux 程序管理命令篇

工作管理 & 放在命令最后,可以把该命令加入后台执行 [Ctrl]-Z 将目前的工作丢到后台中 “暂停” jobs 查看目前后台的工作状况 jobs [参数] 参数: -l  : 除了列出 jobs number 与命令串之外,同时列出 PID 的号码 -r  : 仅列出正在后台 run 的工作 -s  : 仅列出正在后台当中暂停的工作 fg 后台工作拿到前台来处理 例  : fg %number bg 让后台的工作变成运行 例  : bg %number kill 管理后台当中的工作 参数 -

linux程序调试常用命令

1 调用跟踪     跟踪系统调用 strace ls –l     跟踪库调用  ltrace 2 lsof(list open file)     查看程序命令打开了哪些文件  lsof –p PID; lsof –c CMD     查看某个用户打开的文件  lsof –u root     查看某个文件被哪个程序访问 lsof filename 3 proc文件系统     虚拟文件系统,可以使用cat,more,less查看     例如:cat /proc/cpuinfo;    c

LINUX 运维命令

查看3306端口被什么程序占用 [[email protected] ~]# lsof -i :3306 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME mysqld 6153 mysql 10u IPv4 13751 TCP *:mysql (LISTEN) mysqld 6153 mysql 111u IPv4 13816917 TCP 10.1.1.13:mysql->apache2:4832 (ESTABLISHED) mysqld 6153

web服务器管理Linux必备的命令

1.站点根目录下查找是否被放置webshell木马根据语句判断是不是PHP木马脚本 # find /storage/www/ -name "*.php" | xargs grep-in --color "eval("# grep -i --include='*.php' -r system\s*\( /storage/www/2.统计访问日志中来自同ip出现的次数分析盗链.攻击.机器人# cat access.log |awk '{print $1}'| sort

Linux常用Debug命令

1.查看TCP连接状态 netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn  netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}' netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}' netstat -n | awk '

常用Linux运维命令

1.查看TCP连接状态 netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}' netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}' netstat -n | awk '/

使用VS+VisualGDB编译调试Linux程序

Linux程序开发变得越来越多,越来越多的程序.产品需要跨平台,甚至有些开源项目只支持Linux平台,所以掌握Linux开发变得越来越重要. 但是对于习惯了Windows下的开发,使用了VS这个宇宙第一IDE后,觉得Linux下的纯命令行开发调试,还是有些不习惯,效率有些低(大神除外).那么能不能用VS来开发调试Linux程序呢,经过各种查找,找到了VisualGDB这个神奇的插件,通过VS+VisualGDB就可以编译调试Linux程序. 下面我们来看一下创建demo的过程吧. 配置虚拟机 V

Linux下C/C++程序调试基础(GCC,G++,GDB,CGDB,DDD)

在写程序的时候,经常会遇到一些问题,比如某些变量计算结果不是我们预期的那样,这时我们需要对程序进行调试.本文主要介绍调试C/C++在Linux操作系统下主要的调试工具. 在Linux下写程序,C/C++主要的编译器有GCC/G++,ICC等,像我等穷码农,最喜欢GCC了,很大原因是他免费!所以,我们以GCC/G++为例介绍主要的调试工具. 分以下几个内容介绍: 1.调试之前的工作 2.选择调试工具 3.调试步骤 点我,请帮我投一票! 调试之前的工作 编译器在编译阶段需要产生可供调试的代码,才能被