linux 捕获sigsegv信息如何生成core文件,Linux下如何捕获SIGSEGV 的发生位置

Linux下如何捕获SIGSEGV 的发生位置

发布时间:2008-04-23 01:28:28来源:红联作者:Mwany

Linux下编程(尤其是服务端程序)若由于内存越界或其他原因产生“非法操作”,会导致程序悄无声息地死去,初学者往往不知道程序死掉的原因。本人也曾饱受程序死不瞑目之苦。其实“非法操作”在绝大多数时候是因为“段错误”,即 SIGSEGV。而找到SIGSEGV信号抛出的位置,也就找到了程序死掉的原因。

下面列出一些捕获SIGSEGV的方法。

假设程序名为 myprg,其进程ID(pid)为 2032。

方法一:

# ./myprg // 运行程序

# ps -ef | grep myprg // 找出 myprg 的 pid

# gdb myprg 2032 > debug.log // 让 gdb 接管 myprg 的运行

# (gdb) continue

此方法利用gdb调试器捕获SIGSEGV。上例中,将gdb输出信息存入debug.log,关闭终端,gdb并不退出,继续运行直到 myprg 出错退出。gdb将捕获到出错点。

方法二:

# ./myprg // 运行程序

# Segment fault (core dumped) // 程序死掉了,系统输出 "Segment fault"

# gdb myprg core // 用 gdb 分析 core 文件

此方法利用core文件,进行事后分析。但前提是保证系统会生成core文件。

如何知道系统会不会生成core文件?可输入命令:

# ulimit -a

查看当前core文件大小的限制,若为0,则需将它改为unlimited。

# ulimit -S -c unlimited

或修改 /etc/profile,找到 unlimit -S -c 0,将0改为unlimited,重启系统。

另外,如果程序安装了 SIGSEGV 异常处理函数,那么 gdb myprg core 时显示的并不是真实的出错位置,要想看到真实的出错点,必须暂时去掉异常处理函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux操作系统中,当我们遇到"signals.sigsegv: 11"错误时,它意味着程序发生了段错误(Segmentation Fault)。段错误是一种非法的内存访问错误,它发生在程序试图访问不属于它的内存区域的时候。 通常情况下,段错误是由以下几种情况引起的: 1. 空指针引用:当程序试图使用一个指向空地址的指针时,就会触发段错误。这通常是因为指针没有被正确初始化或者在返回之前被释放引起的。 2. 栈溢出:当程序的递归深度太大或者使用了过多的本地变量,就有可能导致栈溢出,进而触发段错误。 3. 动态内存管理错误:当程序使用了过多的动态分配的内存(如malloc、new等),并且没有正确释放,就有可能出现内存泄漏,最终导致段错误。 4. 数组越界访问:当程序试图访问一个超出数组边界范围的元素时,就会触发段错误。这通常是由于循环索引错误或者数组大小计算错误引起的。 当出现"signals.sigsegv: 11"错误时,我们需要通过执行追踪工具(如gdb)来找到错误的原因和位置。通常会打印出错误的堆栈跟踪信息,指示出触发段错误的具体行号和函数名。通过定位到错误位置,我们可以检查具体的代码逻辑,查找并修复问题。 为了避免段错误的出现,我们应该遵循良好的编程习惯,包括正确初始化指针、避免栈溢出、正确释放动态分配的内存、确保数组访问不越界等。另外,使用调试工具对程序进行调试也是一种有效的方法,可以帮助我们找到并解决潜在的段错误问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值