打印程序堆栈的内容(C语言)

时间:2011-03-27 22:42:51

标签: c

  

可能重复:
  How can one grab a stack trace in C?

您好,

我想知道如何打印当前程序堆栈的内容(使用C语言)。

比如说。

    call_some_function() 
{
    ...
    ...
           print_stack_till_now();
    return something;
    }

    call_some_other_function() 
{
    ...
    ...
           print_stack_till_now();
    return something;
    }

    main()
    {
       print_stack_till_now();
       call_some_function();
       print_stack_till_now();
       call_some_other_function();
       print_stack_till_now();

       return 0;
    }

在上一个例子中(可能不是一个例子:))当我调用print_stack_till_now()函数时,我应该能够打印当前构建的堆栈(包括较新的函数调用条目,返回位置,它们的争论等。)

在C语言中是否可以实现这样的功能(甚至是内联汇编)。请指出编写这样一个函数所需的理论(或现有代码会更好)。

在gdb中我们可以使用backtrace来查看当前的堆栈,我正在寻找类似的东西。为什么我需要这个?...只是想学习。

谢谢。

1 个答案:

答案 0 :(得分:1)

没有可移植的方法来实现这一点,原因很简单,C本身并没有定义堆栈数据结构的概念。它完全可以实现自动存储和函数调用返回的实现方式。

据说大多数实现都提供了某种堆栈展开机制。例如,GCC / glibc提供运行时特定的函数backtrace

http://www.gnu.org/s/libc/manual/html_node/Backtraces.html

其他平台也有类似的堆叠展开器。当然,您可以通过全局线程本地存储阵列实现自己的回溯机制(它可以是静态的,并且必须仅为堆栈大小支持的函数调用提供足够的条目),其中每个函数调用调用模块(使用C预处理器__FILE__),放置行(C预处理器__LINE__)和被调用函数(一些额外的预处理器魔法)。