我是靠谱客的博主 合适石头,最近开发中收集的这篇文章主要介绍C语言获取程序崩溃信号,打印调用栈backtrace、backtrace_symbols、addr2line,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
源程序
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <execinfo.h>
void crashHandler(int signal)
{
void *bt[20];
int btSize = 20;
char **btStrings;
switch (signal)
{
case SIGINT:
printf("SIGINT Interactive attention signal. n");
break;
case SIGILL:
printf("SIGILL Illegal instruction. n");
break;
case SIGABRT:
printf("SIGABRT Abnormal termination. n");
break;
case SIGFPE:
printf("SIGFPE Erroneous arithmetic operation. n");
break;
case SIGSEGV:
printf("SIGSEGV Invalid access to storage. n");
break;
case SIGTERM:
printf("SIGTERM Termination request. n");
break;
case SIGHUP:
printf("SIGHUP Hangup. n");
break;
case SIGQUIT:
printf("SIGQUIT Quit. n");
break;
case SIGTRAP:
printf("SIGTRAP Trace/breakpoint trap. n");
break;
case SIGKILL:
printf("SIGKILL Killed. n");
break;
case SIGBUS:
printf("SIGBUS Bus error. n");
break;
case SIGSYS:
printf("SIGSYS Bad system call. n");
break;
case SIGPIPE:
printf("SIGPIPE Broken pipe. n");
break;
case SIGALRM:
printf("SIGALRM Alarm clock. n");
break;
case SIGURG:
printf("SIGURG Urgent data is available at a socket. n");
break;
case SIGSTOP:
printf("SIGSTOP Stop, unblockable. n");
break;
case SIGTSTP:
printf("SIGTSTP Keyboard stop. n");
break;
case SIGCONT:
printf("SIGCONT Continue. n");
break;
case SIGCHLD:
printf("SIGCHLD Child terminated or stopped. n");
break;
case SIGTTIN:
printf("SIGTTIN Background read from control terminal. n");
break;
case SIGTTOU:
printf("SIGTTOU Background write to control terminal. n");
break;
case SIGPOLL:
printf("SIGPOLL Pollable event occurred (System V). n");
break;
case SIGXCPU:
printf("SIGXCPU CPU time limit exceeded. n");
break;
case SIGXFSZ:
printf("SIGXFSZ File size limit exceeded. n");
break;
case SIGVTALRM:
printf("SIGVTALRM Virtual timer expired. n");
break;
case SIGPROF:
printf("SIGPROF Profiling timer expired. n");
break;
case SIGUSR1:
printf("SIGUSR1 User-defined signal 1. n");
break;
case SIGUSR2:
printf("SIGUSR2 User-defined signal 2. n");
break;
case SIGWINCH:
printf("SIGWINCH Window size change (4.3 BSD, Sun). n");
break;
default:
printf("unkown signal:%dn", signal);
break;
}
btSize = backtrace(bt, btSize);
btStrings = backtrace_symbols(bt, btSize);
for (int i = 0; i < btSize; i++)
{
printf("%sn", btStrings[i]);
}
exit(signal);
}
void testCrash()
{
int *a = 0;
int aa = *a;
printf("%dn", aa);
}
void main()
{
signal(SIGSEGV, &crashHandler);
printf("startn");
testCrash();
printf("donen");
}
编译指令
gcc -g crashHandle.c
运行结果
yeqiang@yeqiang-PC:~/tmp$ ./a.out
start
SIGSEGV Invalid access to storage.
./a.out() [0x40136b]
/lib/x86_64-linux-gnu/libc.so.6(+0x37970) [0x7fab38850970]
./a.out() [0x4013db]
./a.out() [0x40141e]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xeb) [0x7fab3883d09b]
./a.out() [0x4010ba]
获取0x4013db对应源码行
yeqiang@yeqiang-PC:~/tmp$ addr2line -e a.out -f 0x4013db
testCrash
/home/yeqiang/tmp/crashHandle.c:119
对应源码
注意事项:
编译时需要增加-g参数,否则addr2line不能得到对应源码行信息。但可以通过汇编分析代码大概位置。
汇编分析:
objdump -d a.out | grep 4013db -C10
最后
以上就是合适石头为你收集整理的C语言获取程序崩溃信号,打印调用栈backtrace、backtrace_symbols、addr2line的全部内容,希望文章能够帮你解决C语言获取程序崩溃信号,打印调用栈backtrace、backtrace_symbols、addr2line所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复