1、strace:trace system calls and signals
1)简介:strace拦截并记录进程调用的系统调用,以及进程收到的信号。它是一个非常有用的程序诊断和调试工具。
2)用法:
(1)示例1:
int main() { std::cout << "hello world" << std::endl; return 0; }
编译成a.out之后,再执行strace ./a.out > /dev/null(防止a.out和strace的输出产生混淆),以下是其输出:
execve("./a.out", ["./a.out"], [/* 26 vars */]) = 0 brk(0) = 0x209d000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3e10278000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) ... ... write(1, "hello world\n", 12) = 12 exit_group(0) = ? +++ exited with 0 +++
可见,关于系统调用的每一行会打印名称、参数和返回值(出错时还有相应的出错字符串)。strace默认在标准出错上打印这些信息。
(2)示例2:
int main() { sleep(100); return 0; }
编译成a.out之后,在终端A执行;在终端B执行strace -p `pidof a.out`。在终端A上把a.out进程切到后台(Ctrl-z),再切回来(fg),可看到终端B的输出(进程收到的信号的信息):
Process 8885 attached restart_syscall(<... resuming interrupted call ...> ) = ? ERESTART_RESTARTBLOCK (Interrupted by signal) --- SIGTSTP {si_signo=SIGTSTP, si_code=SI_KERNEL, si_value={int=3722471000, ptr=0x7f6fdde06658}} --- --- stopped by SIGTSTP --- --- SIGCONT {si_signo=SIGCONT, si_code=SI_USER, si_pid=2455, si_uid=0} --- restart_syscall(<... resuming interrupted call ...>
strace使用-p选项attach到指定PID的进程上(多个-p可attach到多个进程)。
不断学习中。。。
原文:http://www.cnblogs.com/hanerfan/p/5180833.html