libbacktrace堆栈回溯函数使用方法

该方法由Ian Lance Taylor发布并开源,libbacktrace是回溯堆栈,用于跟踪函数的调用关系。
当程序执行函数调用时,它将当前函数的返回地址和一些其他信息压入堆栈中,并跳转到被调用的函数执行。当程序出现异常或死机的时候,可以读取当前寄存器的状态,找到当前PC指针,为了说明问题,往往需要跟踪函数执行过程。

1 重要寄存器信息

程序计数器PC:用于存储当前正在执行的指令地址。
连接寄存器LR:用于存储函数调用时的返回地址,当一个函数被调用时,LR会被设置为调用指令的下一条地址,以便在函数执行完毕后返回到调用点。。
堆栈指针SP:用于指向当前栈的顶部。栈用于存储局部变量、函数调用信息等的一种数据结构而SP则指示了当前栈的位置。。
栈基址FP:用于指向当前函数栈帧的基址(即上一个函数栈帧的栈顶)。·
注意:每个栈帧中的寄存器的值都是历史值,并不是当前值。·
在栈回溯过程中,主要利用FP寄存器进行回溯,因为根据FP可以找到上一个FP寄存器的栈底,获得PC指针,然后固定偏移可以回溯到上个PC指针,以此回溯可以完全跟踪到函数的运行过程。,
栈的回溯分为两种:APCS和unwind。APCS:优点时分析起来比较简单,跟踪起来容易;缺点时指令过多,栈消耗大,占用的寄存器过多。libbacktrace所用到的就是unwind方法,unwind原理是记录每个函数的入栈指令到特殊段。

unwind回溯过程:
1.根据PC找到函数unwind的段内存地址;
2.根据unwind段中信息找到指令相关的编码数据;
3.根据入栈地址,分析函数上一级的栈底保存的sp和Ir。

2 函数库解释

2.1 struct backtrace_state;
回溯函数的状态信息。
2.2 typedef void (*backtrace_error_callback) (void *data, const char *msg, int errnum);
定义一个指向函数的指针的类型名,回溯函数的错误回调参数类型。这个函数,如果非NULL,将在确定的错误情况下被调用,如backtrace_fullO的函数调用错误等等。
2.3 extern struct backtrace_state *backtrace_create_state (const char *filename, int threaded, backtrace_error_calback error_callback, void *data);
此函数返回指向结构体backtrace_state类型的指针变量。为回溯例程创建backtrace状态信息,必须在任何其他例程之前调用。其中filename为可执行文件的路径名。·
2.4 typedef int(*backtrace_full_callback) (void *data, uintptr_type, const char *filename, int lineno, const char *function);
定义一个指向函数的指针的类型名,回溯函数的全部回调参数类型。所有的栈回溯信息,文件名、行号、函数名信息。
2.5 extem int backtrace_full (struct: backtrace_state *state, int skip, backtace full_ calback callback, backtrace_enror_callback error_callback, void *data);
该函数获取所有的回溯堆栈信息。如果所有的回调函数都返回0,则回溯函数返回0。这个函数需要有debug信息才能执行。
2.6 typedef int (*backtrace_simple_callback) (void *data, uintptr_t pc)
定义backtrace_simple函数的回调参数的类型,它不需要任何debug信息来执行。。
2.7 extemn int backtrace_simple (struet backtrace_state *state, int skip, backtrace_simple_ callback callback, backtrace_error_callback enror_callback, void *data);
得到一个回溯例程只用于跟踪堆栈的pc指针信息。。
2.8 extern void backtrace_ print (struct backtrace_state *state, int skip, FILE *)
打印当前回溯信息到文件FILE中。
2.9 extern int backtrace_pcinfo (struct  backtrace_state *state, uintptr_t pc, backtrace_full_callback callback, backtrace_error_callback error_callback, void *data)
给定当前程序的PC指针,调用回调函数信息(文件名, 行号, 函数名)。
2.10 extern- int backtrace_syminfo (struct backtrace_state *state, uintptr_t addr, backtrace_syminfo_callback callback, backtrace_error_callback error_callback, void *data);
给定地址(或PC指针),调用回调函数信息(符号表)。

3 使用方法

1.执行configure 脚本,检查系统环境、依赖关系和编译选项,生成 Makefile文件。
2.make 编译库文件。
3.编译成功后,使用makeinstall将库文件安装到系统目录中。
4.连接库,使用 g++-g-omytestmytest.e-lbacktrace,(-g生成调试信息)。

  • 27
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值