GDB和Segmentation fault

在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:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值