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中也是特别提到的。
  • 相关阅读:
    win10 UWP button
    内网分享资源
    内网分享资源
    CF724F Uniformly Branched Trees
    win10 UWP FlipView
    win10 UWP FlipView
    win10 UWP FlipView
    搭建阿里云 centos mysql tomcat jdk
    搭建阿里云 centos mysql tomcat jdk
    win10 UWP 申请微软开发者
  • 原文地址:https://www.cnblogs.com/super119/p/1996118.html
Copyright © 2011-2022 走看看