c - 如何在C程序中打印堆栈的内容?

标签 c pointers assembly x86

正如标题所说,我想在我的 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/

相关文章:

c - 使用 Ulfius 实现 REST API - URI 定义

c - Arduino IDE 在 Windows 中找不到 sys/time.h

pointers - 使用指向数组的指针

assembly - 如何计算有效地址?

c - 防止 dlsym() 在 Mac OS X 上导入旧版 Sleep() 函数

c - 如何更改存储在结构体中的 VLA 中的值

c - 我不明白以下指针变量声明在 c 中的含义

c - 如何将.text段以外的段中的执行代码放到.text段的中间

assembly - 从 x86 中的寄存器加载值所花费的时间

C程序输出数组最大元素和数组最大元素的索引