【问题标题】:stack overflow in windows when running gdb运行gdb时Windows中的堆栈溢出
【发布时间】:2012-09-29 18:33:37
【问题描述】:

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

我在 linux 上运行完全相同的单元测试没有问题

我还知道我在这些单元测试中使用了一个内存效率极低的基于堆栈的 .ini 文件解析器,因此发生堆栈溢出的可能性似乎是合理的。

我注意到一些在 Windows 上失败的单元测试在 Linux 上通过。进一步的调查揭示了 for 循环中的(基于堆栈的)计数器在 for 循环执行中的随机点处将自身重置为零,并且 for 循环正在检查的数组中的(基于堆栈的)值更改为相同的索引值

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

【问题讨论】:

    标签: c gdb stack-overflow


    【解决方案1】:

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

    在 Linux 上,堆栈大小是动态的,通常由系统管理员设置。

    【讨论】:

    • 在 emacs 中使用 mingw,这样应该可以工作 - 我会试一试。出于兴趣,你怎么知道 --stack 参数的默认值是什么?
    • 我猜这是 gcc 的 RTFM。对于 Visual Studio,初始限制为 4KB,保留限制为 1MB,如果我不得不猜测,那么 gcc 可能类似。
    • 哈哈 RTFM 总是最后的手段 - 4KB 对于 MSVC 来说似乎小得惊人
    • RTFM 的意思当然是“阅读精美手册”。是的,4KB 很小,这些限制对于默认进程堆也是一样的。
    • 在 32 位机器上,不,它只有 1MB。是的,我有机会增加它。
    【解决方案2】:

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

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

    【讨论】:

    • 是否有任何用户可以控制 gdb 分配的堆栈数量,或者只是从 cmd 行运行一个 exe?
    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2013-09-11
    • 2018-01-28
    • 2010-12-22
    • 2017-07-02
    • 2019-05-18
    相关资源
    最近更新 更多