Linux进程控制--STRACE:追踪信号和系统调用


在传统的UNIX系统上,判断一个进程实际正在做什么相当困难,用户只有根据从文件系统以及ps这样的工具取得的间接数据和经验来推测,而在Linux中,用户可以通过strace命令直接观察一个进程,进程的每一次系统调用,每接收到一个信号,这个命令都能显示出来。用户还可以把strace附在一个正在执行的进程上,监视一会儿该进程,再从进程上脱离,整个过程都不会影响那个进程。

[root@www.bkjia.com ~]# strace top

execve("/usr/bin/top", ["top"], [/* 30 vars */]) = 0

brk(0)                                  = 0x922a000

…………

gettimeofday({1268710722, 9547}, {0, 0}) = 0

stat64("/proc/self/task", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0

open("/proc", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3

fcntl64(3, F_GETFD)                     = 0x1 (flags FD_CLOEXEC)

getdents(3, /* 154 entries */, 32768)   = 2708

stat64("/proc/1", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0

open("/proc/1/stat", O_RDONLY)          = 4

read(4, "1 (init) S 0 1 1 0 -1 4202752 16"..., 1023) = 199

close(4)                                = 0

open("/proc/1/statm", O_RDONLY)         = 4

read(4, "507 222 168 33 0 70 0\n", 1023) = 22

close(4)                                = 0

socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 4

connect(4, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)

close(4)                                = 0

socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 4

connect(4, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)

close(4)                                = 0

open("/etc/nsswitch.conf", O_RDONLY)    = 4

fstat64(4, {st_mode=S_IFREG|0644, st_size=1696, ...}) = 0

mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb777e000

read(4, "#\n# /etc/nsswitch.conf\n#\n# An ex"..., 4096) = 1696

read(4, "", 4096)                       = 0

close(4)                                = 0

…………


以上记录了从调用top命令开始,top命令运行期间,至top命令结束时所有的调用过程。

也可以用#strace –p 1940 (1940是top进程的PID) 命令来附加到正在运行的进程上来查看其状态。

由于结果数据量较大,在终端上无法显示完整信息,可将其结果保存至文件,再查看。# strace –o a.txt top

但不能这样用: strace top >a.txt 这样只会将top命令的结果存入a.txt。

相关内容