Segmentation Fault错误

首先,你的Segmentation Fault错误必须要能重现(废话…)。

   然后,依参照下面的步骤来操作:

   (1)无论你是用Makefile来编译,还是直接在命令行手工输入命令来编译,都应该加上 -g 选项。

   (2)一般来说,在默认情况下,在程序崩溃时,core文件是不生成的(很多Linux发行版在默认时禁止生成核心文件)。所以,你必须修改这个默认选项,在命令行执行:

   ulimit -c unlimited

   表示不限制生成的core文件的大小。

   (3)运行你的程序,不管用什么方法,使之重现Segmentation Fault错误。

   (4)这时,你会发现在你程序同一目录下,生成了一个文件名为 core.*** 的文件,即核心文件。例如,“core.15667”这样的文件。

   (5)用GDB调试它。假设你的可执行程序名为test,则在命令行执行:

   gdb test core.15667

   然后可能会显示出一堆信息:

GNU gdb Fedora (6.8-27.el5)

Copyright (C) 2008 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law. Type “show copying”

and “show warranty” for details.

This GDB was configured as “i386-redhat-linux-gnu”…

warning: Can’t read pathname for load map: Input/output error.

…………………(中间还有很多内容,此处省略)……………………………

Loaded symbols for /usr/lib/libgpg-error.so.0

Core was generated by `./test’.

Program terminated with signal 11, Segmentation fault.

[New process 15668]

0 0x0804c760 in thread _handler () at test.cpp:707

707 CDev* cur_dev = *it_d;

然后我们输入并执行命令 bt :

(gdb) bt

就会得到类似于下面的信息:

0 0x0804c760 in thread _handler () at test.cpp:707

1 0x006b149b in start_thread () from /lib/libpthread.so.0

2 0x0060842e in clone () from /lib/libc.so.6

于是,我们一眼就看出来了:程序是在第707行使用指针时出的问题。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Segmentation fault是一种常见的错误,通常表示程序访问了无效的内存地址。这种错误通常是由于以下几种原因引起的: 1. 空指针引用:当程序试图访问一个空指针时,会导致Segmentation fault错误。可以通过检查指针是否为空来解决这个问题。 2. 数组越界:当程序试图访问数组中超出范围的元素时,会导致Segmentation fault错误。可以通过确保数组索引在有效范围内来解决这个问题。 3. 栈溢出:当程序使用过多的栈空间时,会导致Segmentation fault错误。可以通过增加栈的大小或者优化递归函数来解决这个问题。 4. 内存泄漏:当程序分配了内存但没有释放时,会导致内存泄漏,最终可能导致Segmentation fault错误。可以通过及时释放内存来解决这个问题。 5. 未初始化的指针:当程序使用未初始化的指针时,会导致Segmentation fault错误。可以通过确保指针被正确初始化来解决这个问题。 6. 无效的内存访问:当程序试图访问已经释放或无效的内存时,会导致Segmentation fault错误。可以通过检查内存的有效性来解决这个问题。 在排查Segmentation fault错误时,可以使用以下方法: 1. 使用调试器:使用调试器可以帮助定位错误发生的位置。可以使用gdb调试器来跟踪程序的执行过程,并查看错误发生的原因。 2. 打印调试信息:在代码中插入打印语句,输出相关变量的值,以便定位错误发生的位置。 3. 检查内存访问:检查程序中的指针和数组访问,确保没有越界或空指针引用的情况。 4. 检查内存分配和释放:确保程序中的内存分配和释放操作正确,避免内存泄漏和无效的内存访问。 5. 逐步调试:通过逐步执行程序,观察每一步的结果,找出错误发生的具体位置。 6. 查找错误日志:查找系统日志或应用程序日志,以获取更多关于错误发生的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值