您好,
我想知道如何打印当前程序堆栈的内容(使用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来查看当前的堆栈,我正在寻找类似的东西。为什么我需要这个?...只是想学习。
谢谢。
答案 0 :(得分:1)
没有可移植的方法来实现这一点,原因很简单,C本身并没有定义堆栈数据结构的概念。它完全可以实现自动存储和函数调用返回的实现方式。
据说大多数实现都提供了某种堆栈展开机制。例如,GCC / glibc提供运行时特定的函数backtrace
http://www.gnu.org/s/libc/manual/html_node/Backtraces.html
其他平台也有类似的堆叠展开器。当然,您可以通过全局线程本地存储阵列实现自己的回溯机制(它可以是静态的,并且必须仅为堆栈大小支持的函数调用提供足够的条目),其中每个函数调用调用模块(使用C预处理器__FILE__
),放置行(C预处理器__LINE__
)和被调用函数(一些额外的预处理器魔法)。