【问题标题】:Printing the contents of the program stack (C Language) [duplicate]打印程序堆栈的内容(C语言)[重复]
【发布时间】:2011-03-27 22:42:51
【问题描述】:

可能重复:
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 来查看当前堆栈,我正在寻找类似的东西。为什么我需要这个?...只是想学习。

谢谢。

【问题讨论】:

  • 我认为没有任何本机 C 函数,因此它需要更多信息,例如操作系统和任何人都可以给你一个有效的答案。无论如何,您示例中的每个调用都可能返回/输出完全相同的内容。
  • @jon_darkstar:我编辑了代码。我想这就是我的意思,但写了一个不同的sn-p。谢谢@Ubiquite:Linux

标签: c


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 2017-08-15
    • 2020-12-19
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 2021-02-06
    • 2014-05-22
    • 2020-08-28
    相关资源
    最近更新 更多