C - 使用核心文件检查使用的堆栈大小



>我有一个核心文件,其中应用程序以SIGSEGV终止。我怀疑这是因为应用程序用完了堆栈空间。有没有办法从核心文件中检查使用的堆栈大小?

如果您认为由于无限递归而已达到堆栈大小限制,则确定这一点的一种简单方法是运行btinfo stack,并查看是否有比预期多得多的帧。下面是一个示例,其中我递归调用了一个函数,每个堆栈帧中大约有 1024 字节的本地数据:

(gdb) info stack
#0  recurse () at loop.c:5
#1  0x0000000000400565 in recurse () at loop.c:5
...
#7939 0x0000000000400565 in recurse () at loop.c:5
#7940 0x000000000040058f in main (argc=1, argv=0x7ffe63afef48) at loop.c:10

如果帧中有大量本地数据,也可以仅使用几个帧来超过堆栈大小限制。

要检查堆栈的大致大小,在 Linux/x86 上,您可以检查 _environ (包含相当接近堆栈底部的高地址(和 $sp (当前帧中的堆栈指针(堆栈顶部((之间的差异。

(gdb) print (char *)_environ - (char *)$sp
$5 = 8384904

这看起来非常接近 8MB 的堆栈大小限制。

(gdb) shell ulimit -s
8192

您还可以查看堆栈顶部框架中的$sp与堆栈底部框架中的$sp之间的差异。

(gdb) frame 0
#0  recurse () at loop.c:5
(gdb) set $topsp=$sp
(gdb) frame 7940
#7940 0x000000000040058f in main (argc=1, argv=0x7ffe63afef48) at loop.c:10
(gdb) print (char *)$sp - (char *)$topsp
$6 = 8384640

有一种很好的方法可以在程序中获取堆栈大小。

您可以将第一个变量的地址存储在全局的 main 中。然后,您可以创建一个函数来查找此地址和当前堆栈地址之间的差异。这将为您提供 2 字节内使用的堆栈大小。

在主要。

char * initaddr;
int main()
{
   char dummy;  // Note -- first variable declared.
   initaddr = &dummy;
   // Other stuff...
}
int stacksize(void)
{
   char dummy2, *lastptr;
   lastptr = &dummy2;
   return(lastptr-initaddr); // This will give the stacksize at the instant of the return function.
}

您可以调用此函数来确定到目前为止使用的堆栈大小。这可以用作调试工具。

你不能

,但为了确保你用完了堆栈空间,你可以使用 ulimit 系统命令来确定堆栈大小:ulimit -a。之后,您可以使用 ulimit -s 增加 is 并尝试查看您是否仍在取芯。堆栈大小的默认值非常大,但对于运行程序的用户来说,堆栈大小可能减小了。

相关内容

  • 没有找到相关文章

最新更新