【问题标题】:How to get the position of the function in the call stack?如何获取函数在调用栈中的位置?
【发布时间】:2017-05-09 21:13:20
【问题描述】:

为了提供背景,我想以一种简洁的方式基于调用堆栈直观地打印日志消息。

例如。

应该给出输出为

foo(){ 
    printf("Foo was called");
    bar();
}

bar(){
    printf("bar was called");
    jai();
}
jai(){
    printf("Jai was called");
}

<<< OUTPUT >>>
Foo was called.
   bar was called
      jai was called.

我不想将空格数作为参数传递给这些函数或保持相同的全局计数。

我在想,如果我们可以得到函数在调用堆栈中的位置,那么我们可以在文本之前填充相同数量的空格以获得所需的输出格式。

我看到 backtrace 函数调用也提供了返回的整个堆栈名称。它还返回调用中的函数总数。

有没有只返回位置的函数?

【问题讨论】:

  • "如果我们能得到函数在调用栈中的位置":那要么是很多指令要执行,要么是参数,要么是全局变量。

标签: c linux-kernel system-calls glibc backtrace


【解决方案1】:

它还返回调用中的函数总数。
有没有只返回位置的函数?

它们是一回事。

如果调用栈是:

main -> foo -> bar -> jai

而你想知道jai 是4 级深,那么函数总数jai 的级别。

如果您想忽略 main 并仅计算“您的”函数,请从函数总数中减去 1。

【讨论】:

    【解决方案2】:

    我建议为此使用现有的库。

    如果您的所有(或至少大部分)代码是使用 DWARF 格式的调试信息编译的*(在 Linux 上),我推荐 Ian Taylor 的 libbacktrace(在 GCC 中使用,但可独立使用)。当 DWARF 调试信息可用时,它甚至可以提供源位置信息...

    您也可以使用 GNU glibc backtrace functions

    另请参阅 GCC 的 return address builtins

    注意*:您可以将-g-O2 都传递给gccg++ 编译器以启用调试信息和优化。

    【讨论】:

      猜你喜欢
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      相关资源
      最近更新 更多