linux中追踪函数backtrace调用堆栈

一般察看函数运行时堆栈的方法是使用gdb之类的外部调试器,但是,有些时候为了分析程序的bug,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的。
在头文件execinfo.h中声明了三个函数用于获取当前线程的函数调用堆栈
function: int backtrace(void **buffer,int size)
该函数用与获取当前线程的调用堆栈,获取的信息将会被存放在buffer中,它是一个指针列表。参数 size 用来指定buffer中可以保存多少个void* 元素。函数返回值是实际获取的指针个数,最大不超过size大小
在buffer中的指针实际是从堆栈中获取的返回地址,每一个堆栈框架有一个返回地址
注意某些编译器的优化选项对获取正确的调用堆栈有干扰,另外内联函数没有堆栈框架;删除框架指针也会使无法正确解析堆栈内容
function: char ** backtrace_symbols (void *const *buffer, int size)
backtrace_symbols将从backtrace函数获取的信息转化为一个字符串数组. 参数buffer应该是从backtrace函数获取的数组指针,size是该数组中的元素个数(backtrace的返回值)
函数返回值是一个指向字符串数组的指针,它的大小同buffer相同.每个字符串包含了一个相对于buffer中对应元素的可打印信息.它包括函数名,函数的偏移地址,和实际的返回地址
现在,只有使用elf二进制格式的程序和苦衷才能获取函数名称和偏移地址.在其他系统,只有16进制的返回地址能被获取.另外,你可能需要传递相应的标志给链接器,以能支持函数名功能(比如,在使用gnu ld的系统中,你需要传递(-rdynamic))
该函数的返回值是通过malloc函数申请的空间,因此调用这必须使用free函数来释放指针.
注意:如果不能为字符串获取足够的空间函数的返回值将会为null
function:void backtrace_symbols_fd (void *const *buffer, int size, int fd)
backtrace_symbols_fd与backtrace_symbols 函数具有相同的功能,不同的是它不会给调用者返回字符串数组,而是将结果写入文件描述符为fd的文件中,每个函数对应一行.它不需要调用malloc函数,因此适用于有可能调用该函数会失败的情况
下面的例子显示了这三个函数的用法
#include
#include
#include
/* obtain a backtrace and print it to stdout. */
void
print_trace (void)
{
void *array[10];
size_t size;
char **strings;
size_t i;
size = backtrace (array, 10);
strings = backtrace_symbols (array, size);
printf (obtained %zd stack frames./n, size);
for (i = 0; i < size; i++)
     printf (%s/n, strings);
free (strings);
}
/* a dummy function to make the backtrace more interesting. */
void
dummy_function (void)
{
print_trace ();
}
int
main (void)
{
dummy_function ();
return 0;
}
备注:void *const *buffer -- buffer指向char类型的常量指针的指针(很是拗口)

选房师系统创始人刘永发:后房产投资时代,个人如何掌握投资技巧
光纤适配器是什么_光纤适配器的作用介绍
伺服电机编码器分辨率
AF工作原理及制备工艺简述
DA14531 SmartBond TINY模块,助力客户开发下一代连接设备
linux中追踪函数backtrace调用堆栈
如何自己制作一个无源RS232或者RS485转换器
德众汽车上半年实现营收12.68亿元,报废汽车拆解业务同比增长346.32%
USB 1.0/2.0/3.0的含义 USB各类接口的特点
快速挑选电阻电容封装形式
一款真正意义的“简单易用”的智能手机
Teradyne:预计全球5G部署将推动大量的测试需求
nginx常见面试题:负载均衡有哪些算法?
基于LNK564DN的5V,350 mA(1.75 W)反激
中国家庭燃气报警器市场增加了探测器功能方面的要求
最终用户战略供应商成为中国存储系统厂商新目标
PM2.5粉尘传感器在工地扬尘在线监测系统的实际应用
AMD ZEN3架构设计阶段完成,时钟IPC增加了21%
方大智控依赖自身在智慧照明领域深耕与经营
基于SoPC的通用在线调试器设计