有没有办法在每次调用某个函数时用C或C++将调用堆栈转储到正在运行的进程中?我的 idea 是这样的:

void foo()
{
   print_stack_trace();

   // foo's body

   return
}

其中print_stack_trace的工作原理与Perl中的caller类似.

或者像这样:

int main (void)
{
    // will print out debug info every time foo() is called
    register_stack_trace_function(foo); 

    // etc...
}

其中register_stack_trace_function放置某种内部断点,无论何时调用foo都会导致打印堆栈跟踪.

在一些标准的C库中是否存在这样的东西?

我在Linux上工作,使用GCC.


出身背景

我有一个测试运行,基于一些不应该影响这种行为的命令行switch ,它的行为有所不同.我的代码有一个伪随机数生成器,我假设它是根据这些switch 以不同的方式调用的.我希望能够对每一组switch 运行测试,看看是否对每一组switch 调用不同的随机数生成器.

推荐答案

对于仅用于Linux的解决方案,您可以使用backtrace(3),它只返回一个包含void *的数组(实际上,每个数组都指向相应堆栈帧的返回地址).要将这些转化为有用的东西,有backtrace_symbols(3)个.

关注这notes section in backtrace(3)条:

符号名称可能不可用

C++相关问答推荐

当打印字符串时,为什么在c中没有使用常量限定符时我会收到警告?

特定闪存扇区的内存别名

当execvp在C函数中失败时杀死子进程

如何在IF语句中正确使用0.0

如何使用低级C++写出数值

当我更改编译优化时,相同的C代码以不同的方式运行

如何在c++中包装返回空*的函数

GCC不顾-fno-Builtin-SINCOS旗帜向SINCOS发出呼唤

如何在C++中处理按键

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

如何确保我将使用C标准库函数的函数版本,如&getc";,而不是类似函数的宏版本?

带有数组指针的 struct 在print_stack()函数中打印随机数

程序如何解释变量中的值

我正在使用c学习数据 struct ,在学习堆栈时,我试图将中缀转换为后缀,并编写了这段代码.代码未给出输出

从Raku nativecall调用时精度不同

C 和 C++ 标准如何告诉您如何处理它们未涵盖的情况?

execve 不给出which命令的输出

如何使用 VLA 语法使用 const 指针声明函数

为什么程序在打印每个数字之前要等待所有输入?

(GNU+Linux) 多个线程同时调用malloc()