2012-10-09 23 views
0

我想我在Windows上通过emacs中的gdb运行我的单元测试时遇到了堆栈溢出问题。运行gdb时在窗口中堆栈溢出

我在Linux上运行完全相同的单元测试,没有任何问题

我也知道,我现在用这些单元测试中的窘况内存低效基于堆栈的.ini文件分析器所以它似乎是堆栈溢出发生的合理可能性。

我注意到在Linux上通过的Windows上的几个单元测试。进一步的调查显示for循环中的(基于堆栈)计数器在for循环执行中随机重置为零,for循环正在检查的数组中的(基于堆栈)值更改为相同索引值

我注意到gdb似乎在Windows下分配了自己的执行线程 - 有什么方法可以找出线程被分配了多少堆栈空间?

回答

1

Linux和Windows之间的差异之一是在Windows上,堆栈大小必须在编译时设置(有两种大小,初始化和预定义的保留限制)。不知道你使用的编译器的默认值是什么,但你可以尝试使用--stack参数(gcc)来增加它。

在Linux上,堆栈大小是动态的,一般由sysadmin设置。

+0

在emacs中使用mingw,所以应该工作 - 我会给它一个。出于兴趣怎么能找出--stack参数的默认值是什么? – bph

+1

我想这是gcc的RTFM。对于Visual Studio,初始限制是4KB,保留限制是1MB,如果我不得不猜测,那么gcc可能类似。 – cdarke

+0

哈哈RTFM永远是最后的手段 - 4KB似乎令人惊讶的小MSVC – bph

0

那么,或许Windows对每个进程的最大堆栈数量有比Linux更严格的限制?

This page详细说明如何在Windows中调试堆栈溢出。它不是基于gdb,但也许你仍然可以推断一些东西。

+0

是否有任何用户控制gdb分配的堆栈数量,或只是从cmd行运行一个EXE的事情? – bph