Linux调用backtrack函数打印程序崩溃时的
可以给本身的措施都加上这个对象,便于快速的找到过错吧,看到别人都是这么用的
#include
#include
#include
#include
//signal函数用法参考,backtrace_symbols函数用法参考void WidebrightSegvHandler(int signum){
void*array[10];
size_t size;
char*strings;
size_t i,j;
signal(signum,SIG_DFL);/*还原默认的信号处理赏罚handler*/
size=backtrace(array,10);
strings=(char*)backtrace_symbols(array,size);
fprintf(stderr,"widebright received SIGSEGV!Stack trace:\n");
for(i=0;i size;i++){
fprintf(stderr,"%d%s\n",i,strings[i]);
}
free(strings);
exit(1);
}
int invalide_pointer_error(char*p)
{
*p='d';//让这里出现一个拜访非法指针的过错
return 0;
}
void error_2(char*p)
{
invalide_pointer_error(p);
}
void error_1(char*p)
{
error_2(p);
}
void error_0(char*p)
{
error_1(p);
}
int main()
{
//设置信好的处理赏罚函数,种种信号的界说见signal(SIGSEGV,WidebrightSegvHandler);//SIGSEGV 11 Core Invalid memory reference signal(SIGABRT,WidebrightSegvHandler);//SIGABRT 6Core Abort signal from char*a=NULL;
error_0(a);
exit(0);
}
******@widebright:~/桌面$gcc ******@widebright:~/桌面$./ widebright received SIGSEGV!Stack trace:
0./[0x ]
1[0xb807a400]
2./[0x ]
3./[0x ]
4./[0x c]
5./[0x80486a9]
6/lib/tls/i686/cmov/(__libc_start_main+0xe5)[0xb7f19775]
然后为了定位过错,我们必要加上-g参数重新编译一个带调试信息的版本
******@widebright:~/桌面$gcc-g ******@widebright:~/桌面$./ wideb
调用backtrack函数打印程序崩溃时 来自淘豆网m.daumloan.com转载请标明出处.