21xrx.com
2024-09-20 00:05:55 Friday
登录
文章检索 我的文章 写文章
C++如何打印调用栈?
2023-07-09 12:27:19 深夜i     --     --
C++ 打印 调用栈

C++是一种常用的编程语言,常用于编写高效、高质量的软件。在进行程序调试时,经常需要查看程序执行的调用栈,以便快速定位问题所在。下面介绍几种在C++中打印调用栈的方法。

1.使用backtrace函数

在C++中,可以使用backtrace函数打印调用栈。backtrace函数的原型为:

`

int backtrace(void **buffer, int size);

`

其中,buffer是一个void指针数组,用于返回调用栈的信息;size是返回的调用栈信息的最大条目数。backtrace函数的返回值是实际返回的调用栈信息条目数。

在使用backtrace函数前,需要包含execinfo.h头文件,并使用gcc编译器进行编译。下面是一个使用backtrace函数打印调用栈的示例代码:


#include <execinfo.h> //包含backtrace函数所需头文件

void printStackTrace()

{

  const int MAX_TRACE_SIZE = 16; //最多输出的调用栈信息条目数

  void *array[MAX_TRACE_SIZE]; //存储返回的调用栈信息

  size_t size = backtrace(array, MAX_TRACE_SIZE); //获取调用栈信息

  char **strings = backtrace_symbols(array, size); //将调用栈信息转换为字符串

  if (strings != NULL)

  {

    for (size_t i = 0; i < size; i++)

    {

      printf("%s\n", strings[i]); //输出调用栈信息

    }

    free(strings); //释放字符串数组的空间

  }

}

2.使用gnu_debuglink库

在使用backtrace函数时,需要对代码进行重新编译。如果不想重新编译代码,可以使用gnu_debuglink库来打印调用栈。gnu_debuglink库提供了一个函数,可以在程序运行时读取调用栈信息,并将其输出到标准输出中。

需要注意的是,使用gnu_debuglink库打印调用栈需要在编译时带上-g编译选项,以保留符号信息。下面是一个使用gnu_debuglink库打印调用栈的示例代码:


#include <iostream>

#include <stdio.h>

#include <gnu/libc/backtrace.h> //包含gnu_debuglink库所需头文件

void printStackTrace(int sig)

{

  const int MAX_TRACE_SIZE = 16; //最多输出的调用栈信息条目数

  void *array[MAX_TRACE_SIZE]; //存储返回的调用栈信息

  std::cerr << "Error: signal " << sig << ":\n";

  int size = backtrace(array, MAX_TRACE_SIZE); //获取调用栈信息

  backtrace_symbols_fd(array, size, STDERR_FILENO); //将调用栈信息输出到标准错误输出中

}

int main()

{

  std::set_terminate(printStackTrace); //设置程序终止时的回调函数

  // ...程序代码

  return 0;

}

以上是两种在C++中打印调用栈的方法,可以根据实际情况选择使用。在进行程序调试时,打印调用栈信息可以帮助程序员快速定位问题,并加快错误修复的速度。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复