在Linux下,
Segmentation fault
很常见,此时,使用GDB调试可以帮助你确定出现错误的原因。
我们先想办法重现一下Segmentation fault现象,下面我们先使用Shell的方式来试验,编写demo.sh脚本:
#!/bin/bash
kill -s SEGV $$
其中$$就是脚本的进程号,SEGV信号的作用等同于Segmentation fault,整句基本意思就是让自己崩溃。
保存好,并且加上执行权限:chmod +x demo.sh
# ./demo.sh
Segmentation fault
在出现Segmentation fault的时候,Linux有能力生成一份Core Dump文件,我们激活这种能力:
# ulimit -c unlimited
生成的Core Dump文件的具体信息可以通过如下命令查看:
# cat /proc/sys/kernel/core_pattern
core
这表示会在当前目录生成core文件,接着运行一次demo.sh文件就能生成core文件了:
# ./demo.sh
Segmentation fault (core dumped)
# ls
core.16069
下面到了使用gdb的时候了:
# gdb /bin/bash core.16069
(gdb) bt
#0 0x00c7c410 in __kernel_vsyscall ()
#1 0x00733146 in kill () from /lib/libc.so.6
#2 0x0807a561 in kill_pid ()
#3 0x080a2b9f in kill_builtin ()
#4 0x0806b81c in dispose_exec_redirects ()
#5 0x0806d010 in new_fd_bitmap ()
#6 0x0806dc17 in execute_command_internal ()
#7 0x0806f443 in execute_command ()
#8 0x0805ed21 in reader_loop ()
#9 0x0805e817 in main ()
至于这些堆栈信息怎么看就靠你自己的经验了。
下面再看一个GDB调试PHP脚本的例子:一般来说,PHP程序员遇到Segmentation fault的情况并不多,不过有时候PHP内部的Bug还是可能触发这类错误,而且一旦出现,没有明确的错误信息,不易确定原因。我这里举的例子是当前CURL模块的一个Bug,版本信息是PHP 5.2.9,CURL 7.15.5。
编写脚本demo.php:
我们先想办法重现一下Segmentation fault现象,下面我们先使用Shell的方式来试验,编写demo.sh脚本:
#!/bin/bash
kill -s SEGV $$
其中$$就是脚本的进程号,SEGV信号的作用等同于Segmentation fault,整句基本意思就是让自己崩溃。
保存好,并且加上执行权限:chmod +x demo.sh
#
Segmentation fault
在出现Segmentation fault的时候,Linux有能力生成一份Core Dump文件,我们激活这种能力:
#
生成的Core Dump文件的具体信息可以通过如下命令查看:
#
core
这表示会在当前目录生成core文件,接着运行一次demo.sh文件就能生成core文件了:
#
Segmentation fault (core dumped)
#
core.16069
下面到了使用gdb的时候了:
#
(gdb)
#0 0x00c7c410 in __kernel_vsyscall ()
#1 0x00733146 in kill () from /lib/libc.so.6
#2 0x0807a561 in kill_pid ()
#3 0x080a2b9f in kill_builtin ()
#4 0x0806b81c in dispose_exec_redirects ()
#5 0x0806d010 in new_fd_bitmap ()
#6 0x0806dc17 in execute_command_internal ()
#7 0x0806f443 in execute_command ()
#8 0x0805ed21 in reader_loop ()
#9 0x0805e817 in main ()
至于这些堆栈信息怎么看就靠你自己的经验了。
下面再看一个GDB调试PHP脚本的例子:一般来说,PHP程序员遇到Segmentation fault的情况并不多,不过有时候PHP内部的Bug还是可能触发这类错误,而且一旦出现,没有明确的错误信息,不易确定原因。我这里举的例子是当前CURL模块的一个Bug,版本信息是PHP 5.2.9,CURL 7.15.5。
编写脚本demo.php: