调试 堆栈溢出. stackoverflow
来源:互联网 发布:农村淘宝合伙人这么难 编辑:程序博客网 时间:2024/06/04 23:26
问题描述:
xEye引擎跑了大概半小时, 报错堆栈溢出.
停下中断, 查看调用堆栈
栈里的20来个函数, 要么是kernal.dll!***, 要么是 classifying.dll!***.
然后就觉得应该是classifying.dll的问题, 结果查找无果.
思考:
出现栈溢出, 一般有两个问题,
1: 很深的递归调用. 该问题可以较容易的分析得到.
2: 某些函数占用了太多的栈空间.导致后面的函数的栈空间不够用.(上面出现的问题极有可能是处在这里),该问题,比较难以分析
解决:
通过cdb工具(windbg的一个孪生兄弟)
可以在程序出错时, 普通的时候, 把当前进程里的所有线程的使用栈的情况打印出来.
通过cdb工具, 我们发现, 在xEyeUSB线程里, 占用了大部分的栈,
xEyeUsb线程使用了classifying.dll 和 easyusb.dll
而其中的classifying.dll内部的函数 并没有占用多少栈空间, 而easyUSB.dll中的某个函数占用了极多的栈空间.
请看:
......
// 第3个线程 可以看出是xEyeClass!xEyeClassManager::ThreadProc, 应用线程
3 Id: 11f0.17f4 Suspend: 1 Teb: 7ffd9000 Unfrozen
Memory ChildEBP RetAddr
WARNING: Stack unwind information not available. Following frames may be wrong.
01f8f6b0 7c802451 ntdll!KiFastSystemCallRet
10 01f8f6c0 01712f63 kernel32!Sleep+0xf
8b4 01f8ff74 781329bb xEyeClass!xEyeClassManager::ThreadProc+0x3c3
38 01f8ffac 78132a47 MSVCR80!endthreadex+0x3b
40 01f8ffec 00000000 MSVCR80!endthreadex+0xc7
// 第4个线程 xEyeCalculate!calculate_thread 可以看出是 计算线程
4 Id: 11f0.fcc Suspend: 1 Teb: 7ffd8000 Unfrozen
Memory ChildEBP RetAddr
WARNING: Stack unwind information not available. Following frames may be wrong.
0208d9d8 7c802451 ntdll!KiFastSystemCallRet
10 0208d9e8 01731323 kernel32!Sleep+0xf
258c 0208ff74 781329bb xEyeCalculate!calculate_thread+0x273
38 0208ffac 78132a47 MSVCR80!endthreadex+0x3b
40 0208ffec 00000000 MSVCR80!endthreadex+0xc7
// 第5个线程 可以看出是usb_com线程. 这个线程读取usb数据,分类....
// 在最左侧, 我们看到 fbfa8, 这个值, 比附近的值都大, 基本上占据了栈的90%以上的空间. 上面的classifying.dll里面全部函数占用空间加起来也很少. 问题就出在xEyeUSB!usb_com里面了!!!
5 Id: 11f0.e0c Suspend: 1 Teb: 7ffd7000 Unfrozen
*** ERROR: Symbol file could not be found. Defaulted to export symbols for d:/Pc/bin/classifying.dll -
Memory ChildEBP RetAddr
WARNING: Stack unwind information not available. Following frames may be wrong.
020936cc 00f513f1 kernel32!RaiseException+0x52
38 02093704 00f50d5d classifying!SetStaticPoint_Param+0x10111
1c 02093720 00f42a7a classifying!SetStaticPoint_Param+0xfa7d
48 02093768 00f4606f classifying!SetStaticPoint_Param+0x179a
334 02093a9c 00f411f5 classifying!SetStaticPoint_Param+0x4d8f
530 02093fcc 00d9386e classifying!ClassifyAndTrack+0x95
fbfa8 0218ff74 781329bb xEyeUSB!usb_com+0x48e
38 0218ffac 78132a47 MSVCR80!endthreadex+0x3b
40 0218ffec 00000000 MSVCR80!endthreadex+0xc7
.........
cdb -pv -pn myapp.exe -c ".dump /m c:/myapp.dmp;q"
关于如何使用cdb 可以参考 <<通往windbg的捷径>>这篇文章.
http://blog.csdn.net/jiangpeng/archive/2007/08/18/1749205.aspx
据此, 可以基本问题处在xEyeUsb线程的easyusb.dll里面.
- 调试 堆栈溢出. stackoverflow
- StackOverflow内存溢出
- 堆栈溢出
- 堆栈溢出
- 堆栈溢出
- 堆栈溢出
- 堆栈溢出
- 堆栈溢出
- 堆栈溢出
- 堆栈溢出
- 堆栈溢出
- 堆栈溢出
- 堆栈溢出
- 堆栈溢出
- 堆栈溢出
- (StackOverFlow)内才能溢出总结
- 栈溢出(stackoverflow)的原因及解决办法
- 堆栈调试
- 温度报警 机房报警系统
- CPS系统特性介绍—— 2、易于使用和掌握的架构设计
- 金融危机第二波来了吗?
- 身体是革命的本钱
- 浪潮之巅 第八章 没落的贵族 摩托罗拉1. 二战的品牌
- 调试 堆栈溢出. stackoverflow
- 北航 研究生 课程 软件测试工具与实践
- 浪潮之巅 第八章 没落的贵族 摩托罗拉2. 黄金时代
- UrlRewrite 实现 二级域名 重写(完整解决方案)ASP.NET
- GUI Design Studio
- java拷贝文件的小手段
- linux configure参数
- EMF&JPA Teneo
- 证券核算