zoukankan      html  css  js  c++  java
  • 在Linux中打印函数调用堆栈【原创】

    本人学习笔记,代码参考如下网址

    参考http://www.cnblogs.com/dma1982/archive/2012/02/08/2342215.html

    zhangbh@prolin-srv:<~$> gcc -g -rdynamic -o my a.c
    zhangbh@prolin-srv:<~$> ./my 
    backtrace() returned 5 addresses 
    ./my(my_func+0x1f)[0x40089c]
    ./my(run+0x9)[0x4008e0]
    ./my(main+0x14)[0x4008f6]
    /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7f68032c7ec5]
    ./my[0x4007b9]
    Linux中共提供了三个函数用于打印调用堆栈:
    
    /*
    * 函数说明: 取得当前函数的调用堆栈
    * 参数:
    *     buffer:用于存储函数地址的数组
    *     size:buffer数组的长度
    * 返回值:
    *      存储到数组中的函数个数
    */
    int backtrace(void **buffer, int size);
     
    /*
    *
    * 函数说明:将一组函数地址转换为字符串
    * 参数:
    *      buffer: 经由backtrace得到的函数地址
    *      size: buffer数组的长度
    * 返回值:
    *       函数在系统中对应用字符串
    */
    char **backtrace_symbols(void *const *buffer, int size);
     
    /*
    * 函数说明:将一组函数地址转换为字符串
    * 参数:
    *      buffer: 经由backtrace得到的函数地址
    *      size: buffer数组的长度
    *      fd: 输出结果文件描述符
    */
    void backtrace_symbols_fd(void *const *buffer, int size, int fd);
    #include <stdio.h>
    #include <execinfo.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    void my_func(void)
    {
        int j, nptrs;
    #define SIZE 100
        void *buffer[100];
        char **strings;
    
        nptrs = backtrace(buffer, SIZE);
        printf("backtrace() returned %d addresses 
    ", nptrs);
    
        backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO);
    }
    
    void run(void)
    {
        my_func();
    }
    
    int main(int argc, char **argv)
    {
        run();
    
        return 0;
    }

    addr2line
    0x4008e0 -e ./a.out -f
    这样可以找到具体的c文件的行号
  • 相关阅读:
    CTF简介
    最先与最后
    记一次某校版facemash的搭建
    ipv6入门
    win10开启IPv6的两种方法
    安装 Go 1.11 在 Ubuntu 18.04 & 16.04 LTS
    python开发者的AsyncIO
    Python 异步--Await the Future
    Python元类
    alias 和 unalias 命令
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/5889612.html
Copyright © 2011-2022 走看看