最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

C/C++代码内捕获异常发生时的调用栈

来源:博客园


(资料图片仅供参考)

在C/C++代码内捕获异常信号发出时的调用栈信息。

函数实现

#include #include static void backtrace_handler_V1(int sig){  void *array[128];  size_t size;  // get void*"s for all entries on the stack  size = backtrace(array, 10);  // print out all the frames to stder  backtrace_symbols_fd(array, size, STDERR_FILENO);  exit(1);}void backtrace_handler_V2(int sig) {    void* callstack[128];    int frames = backtrace(callstack, 128);    char** strs = backtrace_symbols(callstack, frames);    for (int i = 0; i < frames; ++i) {        printf("%s\n", strs[i]);    }    free(strs);    exit(1);}

测试代码:

int main(int argc, char **argv){    //注册捕捉总线错误时打印堆栈处理的函数    signal(SIGBUS, backtrace_handler_V1);    //注册捕捉段错误时打印堆栈处理的函数    signal(SIGSEGV, backtrace_handler_V1);    return 0;}

注解:

  1. 头文件中包含 ,这两个头文件分别用于处理信号和获取调用栈信息。
  2. 在 backtrace_handler 函数中,首先声明一个指针数组,用于存储调用栈信息。然后调用 backtrace 函数,将当前线程的调用栈信息存储到 callstack 中,并返回调用栈信息的帧数。最后调用 backtrace_symbols(或 backtrace_symbols_fd直接打屏)函数,将 callstack 中的地址转换为字符串形式,并返回一个指向这些字符串的指针数组。最后遍历这个指针数组,即可将调用栈信息输出到日志文件或控制台。
  3. 如果程序在运行过程中发生了错误,程序会被 backtrace_handler 函数捕获并输出调用栈信息。

关键词: