定位“栈溢出”导致的程序崩溃问题
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线性区。
1,查看崩溃时的调用帧栈信息,统计每个函数中的临时变量所占空间之和T,并与S比较;
2,当T < S时,并不能排除“栈溢出”的可能性,比如由于编译器优化代码的关系,从源码上来看某个函数根本不占用很多栈空间,但编译器将其中所有的调用函数展开后反而申请了“极大”的栈空间。遇到此种情况,看汇编代码可以看出使用的栈空间大下,但还有一种方便快速的查看在调用帧栈每个函数所使用栈空间的方法,那就是用gdb去跟踪相应的程序,当它crash时用bt命令打印出调用帧栈,并通过在相应帧栈(frame 命令)查看ESP,EBP值(info r命令)的方法查看相应函数占用的栈空间。
PS:/proc/$pid/maps 下的[stack]行会列出为该进程分配的栈空间地址,此文件中呈现的实质上是一个个vm_area_struct线性区。
相关文章推荐
- WriteFile导致程序崩溃的问题
- 绑定控件导致程序崩溃的问题:Error: no data exchange control with ID 0x%04X.
- 完美解决三星手机拍照后横竖屏切换导致的回调为null以致程序崩溃的问题(包括三星note3的特殊适配)
- MFC项目使用webbrowser控件,点击载入的页面里的文件下载链接后导致程序的崩溃问题的解决方案
- 记32位程序(使用3gb用户虚拟内存)使用D3DX9导致的一个崩溃的问题
- 规避QT4.8.5版本下ocx(dll的情况下)使用QNetworkAccessManager导致程序退出时产生的崩溃问题
- OpenCV findContours导致程序崩溃和相关使用问题
- iOS8 程序 系统设置-定位服务-崩溃问题
- ArcGIS for Android 10.1.1API 中文标注导致程序异常崩溃问题
- findContours导致MFC程序崩溃的问题
- UIActionSheet buttonTitleAtIndex 方法导致程序崩溃的问题
- 内存写越界导致破环堆结构引起的崩溃问题定位经验[如报错malloc(): memory corruption或free(): invalid next size]
- MFC中使用FindContours()函数使用时导致的程序崩溃问题的解决方案
- Android2.3下PopupWindows初始化时NullPointException导致程序崩溃的问题解决
- tableView滑动删除,返回导致程序崩溃问题
- 【Android开发经验】关于主题引用混乱导致程序运行崩溃的问题
- VC++使用dump定位release程序崩溃问题
- linux 使用不安全的sprintf函数,存储字符越界导致程序莫名崩溃问题
- vector小问题导致程序崩溃
- 配置win2003 server IIS的总结,为什么IIs的工作进程会在空闲时间释放的问题。同时学会了throw的真正含义,throw的真正含义就是导致程序停止,崩溃,很简单,网摘也有记录。