通过编程方式获取backtrace

来源:互联网 发布:数据挖掘 风险控制 编辑:程序博客网 时间:2024/06/09 15:33
 http://www.top-e.org/jiaoshi/html/?164.html

在用GDB调试器时可以查看所谓的Backtrace,它包含一系列的函数调用信息,用命令backtracebt可以在GDB中查看函数调用栈的信息。有些场合没法使用GDB时,则可以用glibc库函数中的一些相关函数来得到backtrace的信息(在头文件execinfo.h中):

// 获取将backstrace信息,将地址存到buffer中。

// 参数size指定buffer的最大值,返回值则是backstrace的实际大小

int backtrace (void **buffer, int size)

 

// 根据buffer指定的地址,返回符号信息。参数size指定返回符号信息的大小

char ** backtrace_symbols (void *const *buffer, int size)

 

// 类似backtrace_symbols()函数,但是不需要malloc空间来存放符号信息,

// 而是将结果写到文件描述符fd所代表的文件中

void backtrace_symbols_fd (void *const *buffer, int size, int fd)

使用函数backtrace_symbols()或者backtrace_symbols_fd()时,需要用-rdynamic编译才能得到正确的符号名,否则只能得到偏移地址。

下面的示例代码应用了backtrace()backtrace_symbols()函数来打印backtrace的信息:

     1  #include <execinfo.h>

     2  #include <stdio.h>

     3  #include <stdlib.h>

     4

     5  /* Obtain a backtrace and print it to stdout. */

     6  void print_trace (void)

     7  {

     8    void *array[10];

     9    size_t size;

    10    char **strings;

    11    size_t i;

    12

    13    size = backtrace (array, 10);

    14    strings = backtrace_symbols (array, size);

    15

    16    printf ("Obtained %zd stack frames./n", size);

    17

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

    19       printf ("%s/n", strings[i]);

    20

    21    free (strings);

    22  }

    23

    24  /* A dummy function to make the backtrace more interesting. */

    25  void dummy_function (void)

    26  {

    27    print_trace ();

    28  }

    29

    30  int main (void)

    31  {

    32    dummy_function ();

    33    return 0;

    34  }

编译运行的结果如下:

# gcc bt.c -rdynamic -o bt

# ./bt

Obtained 5 stack frames.

./bt(print_trace+0x14) [0x80486e4]

./bt(dummy_function+0xb) [0x8048765]

./bt(main+0x15) [0x804877c]

/lib/tls/libc.so.6(__libc_start_main+0xe4) [0x42015574]

./bt(backtrace_symbols+0x31) [0x8048641]

你可以应用这些函数在程序异常退出时打印backtrace或将它保存到某个文件中,用于之后的分析。更详细的介绍可以参考http://www.linuxjournal.com/article/6391

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑显示副本不是正版怎么办 斗战神师徒一个人删除角色怎么办 起业kx5防盗器不响怎么办 灌浆记录仪存盘满了怎么办 自首后发现无罪证据怎么办 中国劲酒过期了怎么办 玻尿酸流到眼皮怎么办 手指被胶带缠紫了怎么办 打玻尿酸不平整怎么办 孩子被老师体罚我该怎么办 孩子妈妈入狱了我该怎么办 机顶盒电视收不到台怎么办 跳芭蕾舞下面硬起来了怎么办 深情密码结局赵深深怎么办 宝宝头着地摔了怎么办 小孩头着地摔了怎么办 头朝下墩了脖子怎么办 两岁摔倒头着地怎么办 马桶大便冲不下去怎么办 脚丫吧里起泡痒怎么办 脚受伤后肿了怎么办 摔到了腿受伤了怎么办 骑车摔倒了肿了怎么办 生活大冒险老婆失踪了怎么办 手机qq图裂了怎么办 qq发的图裂了怎么办 抖音账号搬运多怎么办 别人搜不到我QQ怎么办 qq号被限制解封怎么办 买的桌子会晃怎么办 车子座椅皮坏了怎么办 裤子被椅子刮了怎么办 脚麻了被别人动怎么办 毛孔又粗又黑怎么办 手臂睡觉压麻了怎么办 睡觉压的胳膊麻怎么办 摔跤摔到腰肿了怎么办 牛奶喝多了拉稀怎么办 doc文档下载是乱码怎么办 家人被教练技术骗了怎么办 十个月宝宝不爱喝水怎么办