定位“栈溢出”导致的程序崩溃问题

    程序在莫名其妙的地方崩溃了,如果按正常逻辑来讲,它是无论如何不会在那个地方crash的。这时如果你怀疑是创建线程时栈空间太小(Linux下默认栈空间是8MB,但创建线程时可自己调节此大小)导致“栈溢出”引起的,可按如下步骤定位:记创建线程时所分配的栈空间大小为S

1,查看崩溃时的调用帧栈信息,统计每个函数中的临时变量所占空间之和T,并与S比较;

2,当T < S时,并不能排除“栈溢出”的可能性,比如由于编译器优化代码的关系,从源码上来看某个函数根本不占用很多栈空间,但编译器将其中所有的调用函数展开后反而申请了“极大”的栈空间。遇到此种情况,看汇编代码可以看出使用的栈空间大下,但还有一种方便快速的查看在调用帧栈每个函数所使用栈空间的方法,那就是用gdb去跟踪相应的程序,当它crash时用bt命令打印出调用帧栈,并通过在相应帧栈(frame 命令)查看ESP,EBP值(info r命令)的方法查看相应函数占用的栈空间。


PS:/proc/$pid/maps 下的[stack]行会列出为该进程分配的栈空间地址,此文件中呈现的实质上是一个个vm_area_struct线性区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值