【问题标题】:How to prevent a stack overflow by monitoring the stack size?如何通过监控堆栈大小来防止堆栈溢出?
【发布时间】:2010-10-29 11:47:43
【问题描述】:

许多 C/C++/Fortran 和其他程序员都会遇到“堆栈溢出”错误。 我的问题是,是否有工具、程序或简单的代码 sn-p 允许我们在程序运行时监视或检查堆栈的大小?这可能有助于查明堆栈在何处累积并最终导致溢出。

【问题讨论】:

    标签: size stack-overflow monitor


    【解决方案1】:

    看看这个question。接受的答案引用了 Raymond Chen:

    If you have to ask, you're probably doing something wrong.
    

    如果您确实需要这样做,那么解决方案/工具将取决于平台。一个简单的技巧是用已知的字节值(例如 AA)填充堆栈,并监视没有该值的第一个字节的位置。这将为您提供使用的最大堆栈大小,而不是当前堆栈大小。

    【讨论】:

    • 我同意。例如,DSP/BIOS 操作系统使用模式 0xDEADBEEF 填充新分配的堆栈,并使用它来跟踪堆栈使用情况。 x86 处理器上的另一种方法(不容易实现,必须由操作系统完成)是将堆栈放在单独的段上。然后操作系统可以将段描述符设置为分配的长度,以便溢出会导致 GPF,此时堆栈内容将向上移动和扩展。不知道是否有人会真正实现这一点!
    【解决方案2】:

    我不知道是否有程序可以为您执行此操作,但您可以轻松地检查堆栈指针所在的函数内部(至少在 C 和 C++ 中)。只需查看任何变量的内存位置即可。它不会是确切的位置,但应该在几个字节内(这对您的目的来说很好),因为局部变量是在堆栈上定义的。如果您想要确切的值,我相信您可以通过组装获得。

    不过,当程序崩溃时,只查看堆栈跟踪可能会更容易。

    【讨论】:

    • 并且,如果您将最低堆栈帧 (main()) 中的局部变量的地址存储在全局可访问变量中,则将其称为“g_my_stack_base”,然后您可以在任何函数中检查近似堆栈大小使用 approx_stack_size = my_local_function_variable - g_my_stack_base。丑陋但有效。确保使用 char * 指针,以便指针算法返回字节。
    猜你喜欢
    • 2013-11-15
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2012-02-03
    • 2019-05-18
    • 2016-10-02
    • 1970-01-01
    • 2021-04-07
    相关资源
    最近更新 更多