调试 堆栈溢出. 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里面.

原创粉丝点击