c++ - 在 C 或 C++ 中打印调用堆栈

标签 c++ c linux callstack

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

void foo()
{
   print_stack_trace();

   // foo's body

   return
}

print_stack_trace 的工作方式类似于 caller在 Perl 中。

或者是这样的:

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 库中是否存在类似的东西?

我正在使用 GCC 在 Linux 上工作。


背景

我有一个测试运行,它基于一些不应影响此行为的命令行开关而表现不同。我的代码有一个伪随机数生成器,我假设它根据这些开关被不同地调用。我希望能够使用每组开关运行测试,看看随机数生成器是否对每个开关都有不同的调用。

最佳答案

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

关注notes section in backtrace(3) :

The symbol names may be unavailable without the use of special linker options. For systems using the GNU linker, it is necessary to use the -rdynamic linker option. Note that names of "static" functions are not exposed, and won't be available in the backtrace.

关于c++ - 在 C 或 C++ 中打印调用堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3899870/

相关文章:

python - DHT11 传感器在 Edison 上出现故障,而在 RPi 上工作成功

linux - 如何将 GNU Screen 复制缓冲区复制到剪贴板?

c++ - C++ 中线程计数的静态类变量

c++ - 为什么游戏窗口在特定时间后关闭?

c++ - 如何让预处理器为 __LINE__ 关键字生成一个字符串?

c - 将多维数组传递给函数

c - 网络编程中如何完成tcp拆解的完整4步

c++ - 将文本文件中的信息读入文本文件中的 3 个不同数组 (c++)

c - openmp 代码执行期间的 "cygwin_exception::open_stackdumpfile error"

linux - 如何在 AWS 的 Linux AMI 限制下将 SoX 二进制文件打包为 NodeJS AWS Lambda 函数的 MP3 支持?