您的位置:首页 > 运维架构 > Linux

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

2014-04-20 00:03 288 查看
    程序在莫名其妙的地方崩溃了,如果按正常逻辑来讲,它是无论如何不会在那个地方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线性区。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gdb linux 优化
相关文章推荐