happytc 发表于 2012-3-29 10:39:57

问个奇怪的栈溢出

非au3的,是VC++的,若版版觉得不合适,请拖进无意区,之所以想在这里问一下
就是模糊记得这里好象有位C或C++的高手,但我不记得是那个了(不然就直接msg了),也不是很确定是在本论坛,因为平逛的论坛多了点,好了不说费话了,下面是问题

====================================================

windows下的C++程序(用VC),有dump、pdb、源码dump分析显示错误是stack overflow 但是从线程的调用栈来看远没有达到1M的栈空间啊(栈才用了9个页面啊,离默认的1M的栈空间<编译选项是1兆>),崩溃位置是系统函数,_chkstk+0x27下面的test那一行
sub   eax, _PAGESIZE_         ; decrease by PAGESIZE
test    dword ptr ,eax   ; probe page.
jmp   short cs10
当前栈信息
0:008> !teb
TEB at 7ffdb000
    ExceptionList:      01a5f410
    StackBase:            01a60000
    StackLimit:         01a57000
eax=01a57000   esp=01a5fefc
看样子是到达栈底了,目前的栈才0x9000,9个页面而已,应该是到达栈底后栈扩展才对啊(最多应该是异常提示),为何会发生崩溃? 求高手解答

=========================================

xms77 发表于 2012-3-29 16:31:10

当年刚毕业时学过C,已经忘得心中无C的境界了,也自学过C++,因为看不懂所以没有坚持学下去,现在真后悔浪费了很多光阴,亡羊补牢,悔之晚矣!现在记性差的一笔。

pusofalse 发表于 2012-3-29 16:56:41

StackBase是栈最顶部,StackLimit是栈最底部,esp始终指向当前的栈顶。线程运行时esp始终大于等于StackLimit,且小于等于StackBase,当不在这个范围时,就会引发栈溢出的异常。异常发生时,StackBase=01a60000,StackLimit=01a57000,esp=01a5fefc,属于正常范围,不会引发栈溢出的异常。你确定是栈溢出?异常代码是多少?如果不是EXCEPTION_STACK_OVERFLOW(0xC00000FD),就不是栈溢出错误,是其他错误了。

happytc 发表于 2012-3-29 22:19:19

回复 3# pusofalse


    谢谢p版回复
关键是这个发生是几率性的,因为我自己的机子从来没发生过,而是客户机通过CrashReport模块上传到服务器的dump看到的上述信息。
现在我想是不是别的程序把内存占满了,而使_chkstk踩空于是commit一个新页时内测不够了而发生的异常。只能先这样安慰自己了,希望是这种情况,这样就不是程序本身的问题了,不然这种bug最难找了
页: [1]
查看完整版本: 问个奇怪的栈溢出