C中程序堆栈的确切内容是什么?

时间:2010-06-22 04:44:06

标签: c gdb stack

我想知道程序堆栈的确切内容。

分支操作是如何完成的?

使用gdb调试程序时内存转储是什么意思?

它是否提供程序堆栈?

TIA, Praveen

3 个答案:

答案 0 :(得分:3)

C语言本身并不强制要求使用堆栈 - 它定义了行为而不是实现。

但是,在常见的情况下,程序堆栈用于存储多个内容:

  • 使用auto存储持续时间声明的对象(即普通,非static局部变量);
  • 功能参数;
  • 返回地址(代码中执行应在return;或当前函数结束后恢复的位置);
  • 使用非标准alloca()功能分配的内存;
  • 编译器所需的临时值,例如寄存器的保存内容,alloca()的内务处理信息,可变长度数组的大小以及计算中使用的中间值。

这不是一个详尽的列表 - 其他更奇特的东西,如Trampolines,有时也会存储在堆栈中。通常,它是当前函数返回其调用者后不需要的工作项的临时存储区。

调试器中的“回溯”显示堆栈的一些(但不是全部)内容。

答案 1 :(得分:2)

堆栈是一个内存区域,包含子程序参数,局部变量和子程序的返回地址。

在许多体系结构中,包括Intel,堆栈从上到下增长 - 这意味着每次将数据推送到堆栈时堆栈指针都会递减。

典型的函数调用序列如下所示:

  • 推送参数
  • 跳转到子程序(将返回地址推送到堆栈)
  • 在某些语言中,(例如,Pascal)将基指针推送到堆栈。
  • 被调用的子程序在堆栈上为其局部变量分配空间。

要生成堆栈跟踪,运行时环境只需扫描堆栈以确定返回地址所指向的位置。我写的“简单”,但如果基本指针没有保存到堆栈中并不是那么简单,因为可能无法确定除当前堆栈帧之外的任何堆栈帧的位置。

答案 2 :(得分:0)

请参阅下面的链接,它可以为您提供更好的主意 Variables and Memory

它在内存损坏发生之前提供堆栈跟踪。堆栈跟踪是与传递的参数一起进行的一系列函数调用。