Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何获取函数在调用堆栈中的位置?_C_Linux Kernel_System Calls_Glibc_Backtrace - Fatal编程技术网

C 如何获取函数在调用堆栈中的位置?

C 如何获取函数在调用堆栈中的位置?,c,linux-kernel,system-calls,glibc,backtrace,C,Linux Kernel,System Calls,Glibc,Backtrace,为了提供一个背景,我想以一种整洁的方式基于调用堆栈直观地打印日志消息 比如说 应该将输出作为 foo(){ printf("Foo was called"); bar(); } bar(){ printf("bar was called"); jai(); } jai(){ printf("Jai was called"); } <<< OUTPUT >>> Foo was called. bar was c

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

比如说

应该将输出作为

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.
foo(){
printf(“Foo被称为”);
bar();
}
bar(){
printf(“称为酒吧”);
jai();
}
jai(){
printf(“Jai被称为”);
}
>
福被叫来了。
酒吧被叫来了
贾伊被叫去了。
我不想将空格数作为参数传递给这些函数,也不想保持相同的全局计数

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

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

是否有只返回位置的函数

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

他们是同一个人

如果调用堆栈为:

main -> foo -> bar -> jai
你想知道,
jai
有4层,那么函数的总数就是
jai
的层

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

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

他们是同一个人

如果调用堆栈为:

main -> foo -> bar -> jai
你想知道,
jai
有4层,那么函数的总数就是
jai
的层


如果要忽略
main
而只计算“您的”函数,请从函数总数中减去1。

我建议使用现有库

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

您还可以使用GNU glibc

另见海湾合作委员会的报告


注*:您可以将
-g
-O2
传递给
gcc
g++
编译器,以启用调试信息和优化功能。

我建议使用现有库

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

您还可以使用GNU glibc

另见海湾合作委员会的报告

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

“如果我们可以获得函数在调用堆栈中的位置”:即执行大量指令、参数或全局变量。“如果我们能得到函数在调用堆栈中的位置”:这要么是要执行的大量指令,要么是一个参数,要么是一个全局变量。