zoukankan      html  css  js  c++  java
  • 使用backtrace库函数打印call stack,Debug利器

    glibc提供了backtrace这个库函数,可以用来打印call stack。这个对于debug非常的有帮助。比如我们可以在程序中注册常见的一些signal,比如SIGSEGMENT, SIGPIPE,然后在这些信号的回调函数中,利用backtrace打印出call stack,这样debug就非常的方便。

    backtrace的使用很简单,使用man手册中的Example代码即可,例如:
    Code: Select all
        char strbuffer[1024];
        int errcode;
        int btnum = 0;
        void *btbuf[100];
        char **btstrings = NULL;
        int i;

        /* Get backtrace */
       btnum = backtrace(btbuf, 100);
        btstrings = backtrace_symbols(btbuf, btnum);
        errcode = errno;
        if (btstrings == NULL) {
            sprintf(strbuffer, "ALPCLOSE get backtrace failed. ErrCode: %d, Error description: %s\n",
                    errcode, strerror(errcode));
        } else {
            sprintf(strbuffer, "Backtraces, total %d items\n", btnum);
            fputs(strbuffer, outfile);
            for (i = 0; i < btnum; i++) {
                sprintf(strbuffer, "%s\n", btstrings[i]);
                fputs(strbuffer, outfile);
            }
            free(btstrings);
        }


    首 先用backtrace,最多生成100层的call stack。然后用backtrace_symbols将backtrace返回的一堆地址翻译成函数名称。backtrace的返回值是具体生成了多少 层的call stack,填充的btbuf是一个void *的数组,里面每个element都是一个void *,其实就是一个地址。

    backtrace_symbols 生成的字符串都是malloc出来的,但是不要最后一个一个的free,因为backtrace_symbols是根据backtrace给出的call stack层数,一次性的malloc出来一块内存来存放结果字符串的,所以,像上面代码一样,只需要在最后,free backtrace_symbols的返回指针就OK了。这一点backtrace的manual中也是特别提到的。
  • 相关阅读:
    HIVE优化学习笔记
    HIVE执行引擎TEZ学习以及实际使用
    端口状态 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT详解,以及三次握手四次挥手,滑动窗口(整理转发)
    kafka时间轮简易实现(二)
    kafka时间轮的原理(一)
    JAVA之G1垃圾回收器
    JAVA之垃圾收集器
    JAVA之内存结构
    SparkSQL学习笔记
    Python 学习 --简单购物车程序
  • 原文地址:https://www.cnblogs.com/super119/p/1996118.html
Copyright © 2011-2022 走看看