我想知道程序堆栈的确切内容。
分支操作是如何完成的?
使用gdb调试程序时内存转储是什么意思?
它是否提供程序堆栈?
TIA, Praveen
答案 0 :(得分:3)
C语言本身并不强制要求使用堆栈 - 它定义了行为而不是实现。
但是,在常见的情况下,程序堆栈用于存储多个内容:
auto
存储持续时间声明的对象(即普通,非static
局部变量); return;
或当前函数结束后恢复的位置); alloca()
功能分配的内存; alloca()
的内务处理信息,可变长度数组的大小以及计算中使用的中间值。这不是一个详尽的列表 - 其他更奇特的东西,如Trampolines,有时也会存储在堆栈中。通常,它是当前函数返回其调用者后不需要的工作项的临时存储区。
调试器中的“回溯”显示堆栈的一些(但不是全部)内容。
答案 1 :(得分:2)
堆栈是一个内存区域,包含子程序参数,局部变量和子程序的返回地址。
在许多体系结构中,包括Intel,堆栈从上到下增长 - 这意味着每次将数据推送到堆栈时堆栈指针都会递减。
典型的函数调用序列如下所示:
要生成堆栈跟踪,运行时环境只需扫描堆栈以确定返回地址所指向的位置。我写的“简单”,但如果基本指针没有保存到堆栈中并不是那么简单,因为可能无法确定除当前堆栈帧之外的任何堆栈帧的位置。
答案 2 :(得分:0)
请参阅下面的链接,它可以为您提供更好的主意 Variables and Memory
它在内存损坏发生之前提供堆栈跟踪。堆栈跟踪是与传递的参数一起进行的一系列函数调用。