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