如何在使用C时弄清楚Linux中的剩余堆栈

时间:2012-04-15 22:52:25

标签: c linux stack-overflow

我正在开发一个倾向于使用大量堆栈内存的程序。有没有办法可以找出堆栈上的剩余空间?这是在linux平台上。

谢谢!

2 个答案:

答案 0 :(得分:6)

  

有没有办法可以找出堆栈上的剩余空间

是的,有:对于主线程,你只需在主要的一些全局(例如&argc)中记录int *g_addr_argc,然后调用getrlimit(RLIMIT_STACK, ...)并比较一些本地的地址到它,例如

char a_local;
struct rlimit rlim_stack;

if (getrlimit(RLIMIT_STACK, &rlim_stack) == 0 &&
    rlim_stack.rlim_cur != RLIM_INFINITY &&
    (uintptr_t)g_addr_argc - (uintptr_t)&a_local > rlim_stack.rlim_cur - 8192) {
  fprintf(stderr, "Danger: getting too close to the stack limit\n");
}

这只适用于主线程。如果您的应用程序是多线程的,则可以使用pthread_getattr_np查找有关当前线程堆栈的信息。

答案 1 :(得分:2)

您可以在代码using setrlimit中自行设置堆栈大小。然后你不必怀疑,你可以在你认为合适的时候增加它(在合理范围内)。

#include <sys/resource.h>

int main (int argc, char **argv)
{
    const rlim_t kStackSize = 16 * 1024 * 1024;   // min stack size = 16 MB
    struct rlimit rl;
    int result;

    result = getrlimit(RLIMIT_STACK, &rl);
    if (result == 0)
    {
        if (rl.rlim_cur < kStackSize)
        {
            rl.rlim_cur = kStackSize;
            result = setrlimit(RLIMIT_STACK, &rl);
            if (result != 0)
            {
                fprintf(stderr, "setrlimit returned result = %d\n", result);
            }
        }
    }

    // ...

    return 0;
}