正在检查堆栈

Examining the Stack

本文关键字:堆栈 检查      更新时间:2023-10-16

我遇到堆栈溢出的问题,想看看堆栈上的内容到底是什么。

如何使用GDB检查堆栈框架?是一个相同的问题,但是info locals在这里看起来很好(很少有变量,大多数是std::vectors和std::maps),所以我不希望堆栈从中溢出。此外,我已经将堆栈限制设置为32MB,所以这应该是足够的,并且不使用递归函数。

有没有一个工具可以显示堆栈的完整内容,可能是按大小排序的?

堆栈溢出最好由特殊的分析器捕获,而不是手动查看gdb中的变量。更有可能是缓冲区溢出,而不是堆栈溢出。在任何一种情况下,这里都列出了一些可以帮助您指出问题的分析器:

  • Valgrind
  • 净化
  • 保险++
  • 电动围栏

祝你好运!

即使您没有调用自己的函数,也有可能创建了两个或多个函数相互递归的情况。

一个好的起点不是检查当前堆栈帧,而是使用"backtrace"(简称"bt")命令检查堆栈帧列表。如果您看到两个或多个函数相互调用的重复模式,那么您就有了相互递归。

您可以使用backtrace命令检查当前堆栈帧。

您还可以在gdb中获取当前堆栈指针(例如,通过运行"info registers"),然后使用检查(或"x")命令转储该位置周围的内存。只需注意堆栈指针指向堆栈下方的,因此您需要从堆栈指针-N开始转储,以查看堆栈上的前N个字节。