正如标题所说,我想在我的 C 程序中打印堆栈的内容。
以下是我采取的步骤:
我制作了一个简单的汇编 (helper.s) 文件,其中包含一个返回我的 ebp 寄存器地址的函数和一个返回我的 esp 寄存器地址的函数
.globl get_esp get_esp: movl %esp, %eax ret # get_ebp is defined similarly, and included in the .globl section
- 我从我的 C 程序中调用了
get_esp ()
和get_ebp ()
函数 (fpC = get_esp ();
其中 fpC 是一个诠释) - 我(我认为成功地)打印了我的 esp 和 ebp 寄存器的地址(
fprintf (stderr, "%x", fcP);
) - 我尝试打印出我的 esp 寄存器的内容,但未能成功。 (我尝试了
fprintf (sderr, "%d", *fcP);
和fprintf (sderr, "%x", *((int *)fcP));
,以及其他方法)。处理此行时,我的程序在运行时遇到了段错误。
我做错了什么?
编辑:这必须通过调用这些汇编函数来获取堆栈指针来完成。 EDIT2:这是一项家庭作业。
最佳答案
如果您使用 GNU 系统,您可以使用 GNU 对 C 库的扩展来处理回溯,参见 here .
#include <execinfo.h>
int main(void)
{
//call-a-lot-of-functions
}
void someReallyDeepFunction(void)
{
int count;
void *stack[50]; // can hold 50, adjust appropriately
char **symbols;
count = backtrace(stack, 50);
symbols = backtrace_symbols(stack, count);
for (int i = 0; i < count; i++)
puts(symbols[i]);
free(symbols);
}
关于c - 如何在C程序中打印堆栈的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9118581/