采用backtrace函数避免gcc 出现的bug 16159。
- backtrace的实现依赖于栈指针(fp寄存器),在gcc编译过程中任何非零的优化等级(-On参数)或加入了栈指针优化参数-fomit-frame-pointer后多将不能正确得到程序栈信息;加上 -g 选项以后创建符号表,关闭所有的优化机制。
- 在编译的时候需要加上-rdynamic选项让链接器将所有符号添加到动态符号表中,这样才能将函数地址翻译成函数名。另外,这个选项不会处理static函数,所以,static函数的符号无法得到。
- 内联函数没有栈帧,它在编译过程中被展开在调用的位置
backtrace 函数的应用
void backtrace_init(void)
{
void *array[64] = {0};
backtrace(array, 64);
return;
}