转自:http://www.syyong.com/php/Using-strace-GDB-and-tcpdump-debugging-tools-in-PHP.html
在 php 中我们最常使用调试方式是输出打印方式,比如通过 echo、var_dump 输出信息到终端或者通过 fwrite、file_put_contents 将信息写入到文件中。这种普通方式能帮我们解决绝大部分调试问题。但仍然有些问题是需要借助其他工具来分析的,比如死循环,程序执行时间超预期,占用 cpu 过高,php 内核或者扩展错误等场景,这时如果借助 strace、gdb、tcpdump 这样的工具就能很好的去帮助我们定位问题。
strace
strace 是 Linux 环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用及它所接收的系统信息。
在 Linux 中,进程是不能直接去访问硬件设备(比如读取磁盘文件,接收网络数据等等),但可以将用户态模式切换至内核态模式,通过系统调用来访问硬件设备。这时 strace 就可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间,调用次数,成功和失败的次数。
比如我们使用 strace 来跟踪 cat 查看一个文件做了什么:
[root@syyong home]$ strace cat index.php execve("/bin/cat", ["cat", "index.php"], [/* 25 vars */]) = 0 brk(0) = 0x21b0000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5fd02fd000 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=41783, ...}) = 0 mmap(NULL, 41783, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f5fd02f2000 close(3) = 0 open("/lib64/libc.so.6", O_RDONLY) = 3 ... fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 3), ...}) = 0 open("index.php", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0664, st_size=27, ...}) = 0 read(3, "<?php echo 'hello world'; ", 32768) = 27 write(1, "<?php echo 'hello world'; ", 27<?php echo 'hello world'; ) = 27 read(3, "", 32768) = 0 close(3) = 0 close(1) = 0 close(2) = 0 exit_group(0) = ? [root@syyong home]$ strace -e read cat index.php read(3, "177ELF2113 3 >