1、backtrace和backtrace_symbols函数
这两个函数的主要作用是打印出函数的调用方式,即压栈的信息。
使用方法:
static void dump(void)
{
void *buffer[30] = {0};
size_t size;
char **strings = NULL;
size_t i = 0;
size = backtrace(buffer, 30);
fprintf(stdout, "Obtained %zd stack frames.nm\n", size);
strings = backtrace_symbols(buffer, size);
if (strings == NULL)
{
perror("backtrace_symbols.");
exit(EXIT_FAILURE);
}
for (i = 0; i < size; i++)
{
fprintf(stdout, "%s\n", strings[i]);
}
free(strings);
strings = NULL;
}
这两个函数是获取调用函数的栈的信息,如果遇到段错误的时候根据退栈信息大体能定位出是在哪个函数或者什么地方出的问题。
2、初始化信号量
void initSegvCatch()
{
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_sigaction = OnSIGSEGV;
act.sa_flags = SA_SIGINFO;
if(sigaction(SIGSEGV, &act, NULL)<0 )
{
perror("sigaction:");
}
}
3、回调函数
static void dump(void)
{
void *buffer[30] = {0};
size_t size;
char **strings = NULL;
size_t i = 0;
size = backtrace(buffer, 30);
fprintf(stdout, "Obtained %zd stack frames.nm\n", size);
strings = backtrace_symbols(buffer, size);
if (strings == NULL)
{
perror("backtrace_symbols.");
exit(EXIT_FAILURE);
}
for (i = 0; i < size; i++)
{
fprintf(stdout, "%s\n", strings[i]);
}
free(strings);
strings = NULL;
}
static void OnSIGSEGV(int signum, siginfo_t *info, void *ptr)
{
printf("\n-------------------------- 进程挂掉时的MAPS文件 --------------------------\n");
/* 动态链接库的映射地址是动态的,需要将maps文件打印出来 */
char file[64], buffer[1032];
pid_t pid = getpid();
snprintf(file, sizeof(file), "/proc/%d/maps", pid);
FILE *fp = fopen(file, "r");
if (NULL != fp)
{
while(fgets(buffer, 1024, fp))
{
fputs(buffer, stdout);
}
}
else
{
printf("读取MAPS文件失败!\n");
}
debuging("-------------------------------------------------------------------------\n\n");
debuging("---------------------------进程挂掉时的堆栈信息--------------------------\n");
static int iTime = 0;
if (iTime++ >= 1)
{ /* 容错处理:如果访问 ucontext_t 结构体时产生错误会进入该分支 */
debuging("ReEnter %s is not allowed!\n", __FUNCTION__);
abort();
}
dump();
debuging("-------------------------------------------------------------------------\n\n");
abort();
}
4、说明
通过信号量SIGSEGV来注册回调打印Maps信息,段错误在我们使用的时候有两种场景:(1)程序一开始跑就直接挂掉,这时候需要打印Maps信息。(2)程序运行着因为某个流程导致程序退出,这个时候可以打印maps信息,也可以通过重新运行程序来获取到maps信息。
5、实际使用操作流程
(1)编译程序或者库的时候一定要记着加上 -g -rdynamic -g用于通过addr2line获取代码的行数 -rdynamic用于显示函数名称。这两者结合就可以直接定位到代码的准确位置,多棒!
(2)我自测代码挂掉后的信息输出:
-------------------------- 进程挂掉时的MAPS文件 --------------------------
00008000-0000b000 r-xp 00000000 00:0e 15091 /test
00012000-00013000 r-xp 00002000 00:0e 15091 /test
00013000-00015000 rwxp 00003000 00:0e 15091 /test
00015000-001e7000 rwxp 00000000 00:00 0 [heap]
20000000-20001000 rwxs 00000000 00:10 1721 /var/fusion.0
20080000-20182000 rwxs 00000000 00:10 1722 /var/fusion.0.1
20190000-20594000 rwxs 00000000 00:10 1725 /var/fusion.0.2
205a0000-215ad000 rwxs 00000000 00:10 1726 /var/fusion.0.3
215b0000-255e1000 rwxs 00000000 00:10 1727 /var/fusion.0.4
40000000-4001c000 r-xp 00000000 00:0d 121 /lib/ld-2.9.so
4001c000-40023000 rwxp 00000000 00:00 0
40023000-40024000 r-xp 0001b000 00:0d 121 /lib/ld-2.9.so
40024000-40025000 rwxp 0001c000 00:0d 121 /lib/ld-2.9.so
40025000-40027000 rwxp 00000000 00:00 0
40028000-4003b000 r-xp 00000000 00:0e 14854 /home/user0/libapi/libapi_base.so
4003b000-40042000 ---p 00013000 00:0e 14854 /home/user0/libapi/libapi_base.so
40042000-40043000 r-xp 00012000 00:0e 14854 /home/user0/libapi/libapi_base.so
40043000-40044000 rwxp 00013000 00:0e 14854 /home/user0/libapi/libapi_base.so
40044000-40050000 r-xp 00000000 00:0e 15047 /home/user0/libapi/libapi_comm.so
40050000-40057000 ---p 0000c000 00:0e 15047 /home/user0/libapi/libapi_comm.so
40057000-40058000 r-xp 0000b000 00:0e 15047 /home/user0/libapi/libapi_comm.so
40058000-40059000 rwxp 0000c000 00:0e 15047 /home/user0/libapi/libapi_comm.so
4005c000-4006e000 r-xp 00000000 00:0e 14996 /home/user0/libapi/libapi_elecsign.so
4006e000-40075000 ---p 00012000 00:0e 14996 /home/user0/libapi/libapi_elecsign.so
40075000-40076000 r-xp 00011000 00:0e 14996 /home/user0/libapi/libapi_elecsign.so
40076000-40079000 rwxp 00012000 00:0e 14996 /home/user0/libapi/libapi_elecsign.so
40079000-4007a000 rwxp 00000000 00:00 0
4007c000-4007e000 r-xp 00000000 00:0e 14993 /home/user0/libapi/libapi_iccard.so
4007e000-40085000 ---p 00002000 00:0e 14993 /home/user0/libapi/libapi_iccard.so
40085000-40086000 r-xp 00001000 00:0e 14993 /home/user0/libapi/libapi_iccard.so
40086000-40087000 rwxp 00002000 00:0e 14993 /home/user0/libapi/libapi_iccard.so
40088000-4008a000 r-xp 00000000 00:0e 14997 /home/user0/libapi/libapi_iso8583.so
4008a000-40092000 ---p 00002000 00:0e 14997 /home/user0/libapi/libapi_iso8583.so
40092000-40093000 r-xp 00002000 00:0e 14997 /home/user0/libapi/libapi_iso8583.so
40093000-40094000 rwxp 00003000 00:0e 14997 /home/user0/libapi/libapi_iso8583.so
40094000-4009b000 rwxp 00000000 00:00 0
4009c000-4009f000 r-xp 00000000 00:0e 14994 /home/user0/libapi/libapi_pinpad.so
4009f000-400a7000 ---p 00003000 00:0e 14994 /home/user0/libapi/libapi_pinpad.so
400a7000-400a8000 r-xp 00003000 00:0e 14994 /home/user0/libapi/libapi_pinpad.so
400a8000-400a9000 rwxp 00004000 00:0e 14994 /home/user0/libapi/libapi_pinpad.so
400ac000-400b2000 r-xp 00000000 00:0e 14990 /home/user0/libapi/libapi_sql.so
400b2000-400b9000 ---p 00006000 00:0e 14990 /home/user0/libapi/libapi_sql.so
400b9000-400ba000 r-xp 00005000 00:0e 14990 /home/user0/libapi/libapi_sql.so
400ba000-400bb000 rwxp 00006000 00:0e 14990 /home/user0/libapi/libapi_sql.so
400bc000-400c4000 r-xp 00000000 00:0e 14856 /home/user0/libapi/libapi_system.so
400c4000-400c5000 r-xp 00008000 00:0e 14856 /home/user0/libapi/libapi_system.so
400c5000-400c6000 rwxp 00009000 00:0e 14856 /home/user0/libapi/libapi_system.so
400c8000-400d1000 r-xp 00000000 00:0e 14995 /home/user0/libapi/libapi_toolfile.so
400d1000-400d8000 ---p 00009000 00:0e 14995 /home/user0/libapi/libapi_toolfile.so
400d8000-400d9000 r-xp 00008000 00:0e 14995 /home/user0/libapi/libapi_toolfile.so
400d9000-400da000 rwxp 00009000 00:0e 14995 /home/user0/libapi/libapi_toolfile.so
400dc000-400de000 r-xp 00000000 00:0d 3584 /usr/lib/libts-0.0.so.0.1.1
400de000-400e5000 ---p 00002000 00:0d 3584 /usr/lib/libts-0.0.so.0.1.1
400e5000-400e6000 r-xp 00001000 00:0d 3584 /usr/lib/libts-0.0.so.0.1.1
400e6000-400e7000 rwxp 00002000 00:0d 3584 /usr/lib/libts-0.0.so.0.1.1
400e8000-4016e000 r-xp 00000000 00:0d 3664 /usr/lib/libsqlite3.so.0.8.6
4016e000-40176000 ---p 00086000 00:0d 3664 /usr/lib/libsqlite3.so.0.8.6
40176000-40177000 r-xp 00086000 00:0d 3664 /usr/lib/libsqlite3.so.0.8.6
40177000-40178000 rwxp 00087000 00:0d 3664 /usr/lib/libsqlite3.so.0.8.6
40178000-40179000 rwxp 00000000 00:00 0
4017c000-4017e000 r-xp 00000000 00:0d 3490 /usr/lib/libiccard.so.0.0.1
4017e000-40185000 ---p 00002000 00:0d 3490 /usr/lib/libiccard.so.0.0.1
40185000-40186000 r-xp 00001000 00:0d 3490 /usr/lib/libiccard.so.0.0.1
40186000-40187000 rwxp 00002000 00:0d 3490 /usr/lib/libiccard.so.0.0.1
40188000-4018c000 r-xp 00000000 00:0d 3667 /usr/lib/libped.so.0.0.1
4018c000-40193000 ---p 00004000 00:0d 3667 /usr/lib/libped.so.0.0.1
40193000-40194000 r-xp 00003000 00:0d 3667 /usr/lib/libped.so.0.0.1
40194000-40195000 rwxp 00004000 00:0d 3667 /usr/lib/libped.so.0.0.1
40198000-401d6000 r-xp 00000000 00:0d 3502 /usr/lib/libncurses.so.5.6
401d6000-401dd000 ---p 0003e000 00:0d 3502 /usr/lib/libncurses.so.5.6
401dd000-401e5000 r-xp 0003d000 00:0d 3502 /usr/lib/libncurses.so.5.6
401e5000-401e6000 rwxp 00045000 00:0d 3502 /usr/lib/libncurses.so.5.6
401e6000-401e7000 rwxp 00000000 00:00 0
401e8000-4021a000 r-xp 00000000 00:0d 3616 /usr/lib/libpcap.so.1.1.1
4021a000-40221000 ---p 00032000 00:0d 3616 /usr/lib/libpcap.so.1.1.1
40221000-40222000 r-xp 00031000 00:0d 3616 /usr/lib/libpcap.so.1.1.1
40222000-40223000 rwxp 00032000 00:0d 3616 /usr/lib/libpcap.so.1.1.1
40224000-40235000 r-xp 00000000 00:0d 3622 /usr/lib/libpos.so.0.0.4
40235000-4023c000 ---p 00011000 00:0d 3622 /usr/lib/libpos.so.0.0.4
4023c000-4023d000 r-xp 00010000 00:0d 3622 /usr/lib/libpos.so.0.0.4
4023d000-4023e000 rwxp 00011000 00:0d 3622 /usr/lib/libpos.so.0.0.4
40240000-40267000 r-xp 00000000 00:0d 3499 /usr/lib/libnfc.so.0.0.6
40267000-4026e000 ---p 00027000 00:0d 3499 /usr/lib/libnfc.so.0.0.6
4026e000-4026f000 r-xp 00026000 00:0d 3499 /usr/lib/libnfc.so.0.0.6
4026f000-40270000 rwxp 00027000 00:0d 3499 /usr/lib/libnfc.so.0.0.6
40270000-40285000 r-xp 00000000 00:0d 3655 /usr/lib/libz.so.1.2.5
40285000-4028c000 ---p 00015000 00:0d 3655 /usr/lib/libz.so.1.2.5
4028c000-4028d000 r-xp 00014000 00:0d 3655 /usr/lib/libz.so.1.2.5
4028d000-4028e000 rwxp 00015000 00:0d 3655 /usr/lib/libz.so.1.2.5
40290000-402a2000 r-xp 00000000 00:0d 3623 /usr/lib/libfusion-1.4.so.5.0.6
402a2000-402aa000 ---p 00012000 00:0d 3623 /usr/lib/libfusion-1.4.so.5.0.6
402aa000-402ab000 r-xp 00012000 00:0d 3623 /usr/lib/libfusion-1.4.so.5.0.6
402ab000-402ac000 rwxp 00013000 00:0d 3623 /usr/lib/libfusion-1.4.so.5.0.6
402ac000-402c3000 r-xp 00000000 00:0d 3657 /usr/lib/libdirect-1.4.so.5.0.6
402c3000-402ca000 ---p 00017000 00:0d 3657 /usr/lib/libdirect-1.4.so.5.0.6
402ca000-402cb000 r-xp 00016000 00:0d 3657 /usr/lib/libdirect-1.4.so.5.0.6
402cb000-402cc000 rwxp 00017000 00:0d 3657 /usr/lib/libdirect-1.4.so.5.0.6
402cc000-403b9000 r-xp 00000000 00:0d 3558 /usr/lib/libdirectfb-1.4.so.5.0.6
403b9000-403c0000 ---p 000ed000 00:0d 3558 /usr/lib/libdirectfb-1.4.so.5.0.6
403c0000-403c3000 r-xp 000ec000 00:0d 3558 /usr/lib/libdirectfb-1.4.so.5.0.6
403c3000-403c5000 rwxp 000ef000 00:0d 3558 /usr/lib/libdirectfb-1.4.so.5.0.6
403c5000-403c6000 rwxp 00000000 00:00 0
403c8000-403d2000 r-xp 00000000 00:0d 3554 /usr/lib/liblite.so.3.0.5
403d2000-403d9000 ---p 0000a000 00:0d 3554 /usr/lib/liblite.so.3.0.5
403d9000-403da000 r-xp 00009000 00:0d 3554 /usr/lib/liblite.so.3.0.5
403da000-403db000 rwxp 0000a000 00:0d 3554 /usr/lib/liblite.so.3.0.5
403dc000-403f3000 r-xp 00000000 00:0d 3514 /usr/lib/libmad.so.0.2.1
403f3000-403fa000 ---p 00017000 00:0d 3514 /usr/lib/libmad.so.0.2.1
403fa000-403fb000 r-xp 00016000 00:0d 3514 /usr/lib/libmad.so.0.2.1
403fb000-403fc000 rwxp 00017000 00:0d 3514 /usr/lib/libmad.so.0.2.1
403fc000-4041d000 r-xp 00000000 00:0d 3570 /usr/lib/libpng12.so.0.38.0
4041d000-40424000 ---p 00021000 00:0d 3570 /usr/lib/libpng12.so.0.38.0
40424000-40425000 r-xp 00020000 00:0d 3570 /usr/lib/libpng12.so.0.38.0
40425000-40426000 rwxp 00021000 00:0d 3570 /usr/lib/libpng12.so.0.38.0
40428000-40453000 r-xp 00000000 00:0d 3489 /usr/lib/libemv.so.1.0.5
40453000-4045a000 ---p 0002b000 00:0d 3489 /usr/lib/libemv.so.1.0.5
4045a000-4045b000 r-xp 0002a000 00:0d 3489 /usr/lib/libemv.so.1.0.5
4045b000-4045d000 rwxp 0002b000 00:0d 3489 /usr/lib/libemv.so.1.0.5
4045d000-4046f000 rwxp 00000000 00:00 0
40470000-405bb000 r-xp 00000000 00:0d 3581 /usr/lib/libcrypto.so.1.0.0
405bb000-405c3000 ---p 0014b000 00:0d 3581 /usr/lib/libcrypto.so.1.0.0
405c3000-405d0000 r-xp 0014b000 00:0d 3581 /usr/lib/libcrypto.so.1.0.0
405d0000-405d7000 rwxp 00158000 00:0d 3581 /usr/lib/libcrypto.so.1.0.0
405d7000-405da000 rwxp 00000000 00:00 0
405dc000-405e4000 r-xp 00000000 00:0d 3563 /usr/lib/libepp.so.0.0.1
405e4000-405eb000 ---p 00008000 00:0d 3563 /usr/lib/libepp.so.0.0.1
405eb000-405ec000 r-xp 00007000 00:0d 3563 /usr/lib/libepp.so.0.0.1
405ec000-405ed000 rwxp 00008000 00:0d 3563 /usr/lib/libepp.so.0.0.1
405ed000-405f1000 rwxp 00000000 00:00 0
405f4000-40699000 r-xp 00000000 00:0d 391 /lib/libm-2.9.so
40699000-406a0000 ---p 000a5000 00:0d 391 /lib/libm-2.9.so
406a0000-406a1000 r-xp 000a4000 00:0d 391 /lib/libm-2.9.so
406a1000-406a2000 rwxp 000a5000 00:0d 391 /lib/libm-2.9.so
406a4000-406b8000 r-xp 00000000 00:0d 360 /lib/libpthread-2.9.so
406b8000-406bf000 ---p 00014000 00:0d 360 /lib/libpthread-2.9.so
406bf000-406c0000 r-xp 00013000 00:0d 360 /lib/libpthread-2.9.so
406c0000-406c1000 rwxp 00014000 00:0d 360 /lib/libpthread-2.9.so
406c1000-406c3000 rwxp 00000000 00:00 0
406c4000-406ca000 r-xp 00000000 00:0d 392 /lib/librt-2.9.so
406ca000-406d1000 ---p 00006000 00:0d 392 /lib/librt-2.9.so
406d1000-406d2000 r-xp 00005000 00:0d 392 /lib/librt-2.9.so
406d2000-406d3000 rwxp 00006000 00:0d 392 /lib/librt-2.9.so
406d4000-406d6000 r-xp 00000000 00:0d 114 /lib/libdl-2.9.so
406d6000-406dd000 ---p 00002000 00:0d 114 /lib/libdl-2.9.so
406dd000-406de000 r-xp 00001000 00:0d 114 /lib/libdl-2.9.so
406de000-406df000 rwxp 00002000 00:0d 114 /lib/libdl-2.9.so
406e0000-40807000 r-xp 00000000 00:0d 354 /lib/libc-2.9.so
40807000-4080f000 ---p 00127000 00:0d 354 /lib/libc-2.9.so
4080f000-40811000 r-xp 00127000 00:0d 354 /lib/libc-2.9.so
40811000-40812000 rwxp 00129000 00:0d 354 /lib/libc-2.9.so
40812000-40815000 rwxp 00000000 00:00 0
40818000-40822000 r-xp 00000000 00:0d 68 /lib/libgcc_s.so.1
40822000-40829000 ---p 0000a000 00:0d 68 /lib/libgcc_s.so.1
40829000-4082a000 r-xp 00009000 00:0d 68 /lib/libgcc_s.so.1
4082a000-4082b000 rwxp 0000a000 00:0d 68 /lib/libgcc_s.so.1
4082b000-4082c000 ---p 00000000 00:00 0
4082c000-4102b000 rwxp 00000000 00:00 0
4102c000-4102e000 r-xp 00000000 00:0d 3552 /usr/lib/directfb-1.4-5/interfaces/IDirectFBFont/libidirectfbfont_dgiff.so
4102e000-41035000 ---p 00002000 00:0d 3552 /usr/lib/directfb-1.4-5/interfaces/IDirectFBFont/libidirectfbfont_dgiff.so
41035000-41036000 r-xp 00001000 00:0d 3552 /usr/lib/directfb-1.4-5/interfaces/IDirectFBFont/libidirectfbfont_dgiff.so
41036000-41037000 rwxp 00002000 00:0d 3552 /usr/lib/directfb-1.4-5/interfaces/IDirectFBFont/libidirectfbfont_dgiff.so
41038000-41044000 r-xp 00000000 00:0d 3524 /usr/lib/directfb-1.4-5/systems/libdirectfb_fbdev.so
41044000-4104b000 ---p 0000c000 00:0d 3524 /usr/lib/directfb-1.4-5/systems/libdirectfb_fbdev.so
4104b000-4104c000 r-xp 0000b000 00:0d 3524 /usr/lib/directfb-1.4-5/systems/libdirectfb_fbdev.so
4104c000-4104d000 rwxp 0000c000 00:0d 3524 /usr/lib/directfb-1.4-5/systems/libdirectfb_fbdev.so
41050000-41057000 r-xp 00000000 00:0d 3586 /usr/lib/libsysfs.so.2.0.1
41057000-4105e000 ---p 00007000 00:0d 3586 /usr/lib/libsysfs.so.2.0.1
4105e000-4105f000 r-xp 00006000 00:0d 3586 /usr/lib/libsysfs.so.2.0.1
4105f000-41060000 rwxp 00007000 00:0d 3586 /usr/lib/libsysfs.so.2.0.1
41060000-41061000 ---p 00000000 00:00 0
41061000-41860000 rwxp 00000000 00:00 0
41860000-418ab000 rwxs 00000000 00:11 190 /dev/fb0
418ac000-418b7000 r-xp 00000000 00:0d 3531 /usr/lib/directfb-1.4-5/wm/libdirectfbwm_default.so
418b7000-418be000 ---p 0000b000 00:0d 3531 /usr/lib/directfb-1.4-5/wm/libdirectfbwm_default.so
418be000-418bf000 r-xp 0000a000 00:0d 3531 /usr/lib/directfb-1.4-5/wm/libdirectfbwm_default.so
418bf000-418c0000 rwxp 0000b000 00:0d 3531 /usr/lib/directfb-1.4-5/wm/libdirectfbwm_default.so
418c0000-41db1000 r-xs 00000000 00:0d 731 /usr/share/fonts/wqy-microhei.ttf
41db4000-41db9000 r-xp 00000000 00:0d 3553 /usr/lib/directfb-1.4-5/interfaces/IDirectFBFont/libidirectfbfont_ft2.so
41db9000-41dc0000 ---p 00005000 00:0d 3553 /usr/lib/directfb-1.4-5/interfaces/IDirectFBFont/libidirectfbfont_ft2.so
41dc0000-41dc1000 r-xp 00004000 00:0d 3553 /usr/lib/directfb-1.4-5/interfaces/IDirectFBFont/libidirectfbfont_ft2.so
41dc1000-41dc2000 rwxp 00005000 00:0d 3553 /usr/lib/directfb-1.4-5/interfaces/IDirectFBFont/libidirectfbfont_ft2.so
41dc4000-41e35000 r-xp 00000000 00:0d 3694 /usr/lib/libfreetype.so.6.6.0
41e35000-41e3d000 ---p 00071000 00:0d 3694 /usr/lib/libfreetype.so.6.6.0
41e3d000-41e40000 r-xp 00071000 00:0d 3694 /usr/lib/libfreetype.so.6.6.0
41e40000-41e41000 rwxp 00074000 00:0d 3694 /usr/lib/libfreetype.so.6.6.0
41e44000-42335000 r-xs 00000000 00:0d 731 /usr/share/fonts/wqy-microhei.ttf
42338000-42467000 r-xs 00000000 00:0d 729 /usr/share/fonts/PosSong-16.ttf
42468000-426ae000 r-xs 00000000 00:0d 721 /usr/share/fonts/PosSong-24.ttf
426b0000-42ba1000 r-xs 00000000 00:0d 731 /usr/share/fonts/wqy-microhei.ttf
42ba4000-43095000 r-xs 00000000 00:0d 731 /usr/share/fonts/wqy-microhei.ttf
43098000-43589000 r-xs 00000000 00:0d 731 /usr/share/fonts/wqy-microhei.ttf
4358c000-435b8000 r-xs 00000000 00:0d 722 /usr/share/fonts/arialnb.ttf
435b8000-435b9000 ---p 00000000 00:00 0
435b9000-435bd000 rwxp 00000000 00:00 0
becfb000-bed03000 rwxp 00000000 00:00 0 [stack]
[1405599744.391]: OnSIGSEGV, 122, -------------------------------------------------------------------------
[1405599744.391]: OnSIGSEGV, 123, ---------------------------进程挂掉时的堆栈信息--------------------------
Obtained 7 stack frames.nm
./test [0x9160]
./test [0x948c]
/lib/libc.so.6(__default_rt_sa_restorer+0) [0x4070cd70]
/home/user0/libapi/libapi_system.so(Api_SerialSend+0x3c) [0x400bea74]
./test [0x8ff4]
./test [0x95a0]
/lib/libc.so.6(__libc_start_main+0x120) [0x406f612c]
[1405599744.396]: OnSIGSEGV, 131, -------------------------------------------------------------------------
(3)分析
上面打印出我的进程的maps信息,下面通过backtrace打印出当前的函数的调用次序,基本上能定位出事api_serialsend函数的调用报错。
(4)获取dmsg信息如下
[13411.470000] Pid: 1194, comm: test
[13411.470000] CPU: 0 Not tainted (2.6.32.9-bcm5892 #3)
[13411.470000] PC is at 0x40758680
[13411.470000] LR is at 0x4004a350
[13411.470000] pc : [<40758680>] lr : [<4004a350>] psr: 60000010
[13411.470000] sp : bed017f8 ip : 00000002 fp : bed02878
[13411.470000] r10: 0000000a r9 : 00000000 r8 : 40058000
[13411.470000] r7 : 00000000 r6 : 00000000 r5 : bed0181e r4 : 00000000
[13411.470000] r3 : bed02850 r2 : 00000006 r1 : 00000000 r0 : bed0181e
[13411.470000] Flags: nZCv IRQs on FIQs on Mode USER_32 ISA ARM Segment user
[13411.470000] Control: 00c5387d Table: 4200c008 DAC: 00000015
[13411.470000] [<c0033120>] (show_regs+0x0/0x4c) from [<c00374e0>] (__do_user_fault+0x5c/0xa4)
[13411.470000] r4:c3e5a6e0
[13411.470000] [<c0037484>] (__do_user_fault+0x0/0xa4) from [<c0037758>] (do_page_fault+0x1b4/0x1e4)
[13411.470000] r7:00000000 r6:c3db5e00 r5:c3e5a6e0 r4:00010000
[13411.470000] [<c00375a4>] (do_page_fault+0x0/0x1e4) from [<c0031310>] (do_DataAbort+0x3c/0x9c)
[13411.470000] [<c00312d4>] (do_DataAbort+0x0/0x9c) from [<c0031f84>] (ret_from_exception+0x0/0x10)
[13411.470000] Exception stack(0xc3fb9fb0 to 0xc3fb9ff8)
[13411.470000] 9fa0: bed0181e 00000000 00000006 bed02850
[13411.470000] 9fc0: 00000000 bed0181e 00000000 00000000 40058000 00000000 0000000a bed02878
[13411.470000] 9fe0: 00000002 bed017f8 4004a350 40758680 60000010 ffffffff
[13411.470000] r8:40058000 r7:00000000 r6:00000000 r5:bed0181e r4:ffffffff
查看LR寄存器的指针地址,这个就是函数崩溃时的地址记录信息。
(5)定位问题所在的库位置
利用lr地址0x4004a350从maps信息中找到在哪个方位内从而能定位挂在哪个库中,40044000-40050000 r-xp 00000000 00:0e 15047 /home/user0/libapi/libapi_comm.so 定位问题是出在libapi_comm.so库中,用0x4004a350 - 0x40044000 = 0x6350,获取到的就是库的偏移地址。
(6)通过偏移地址定位代码位置
然后去libapi_comm.so库,通过addr2line -e libapi_comm.so 0x6350输出如下
/home/user0//application/libapi/libapi_comm/src/serial.c:349
可以很精确的定位出函数挂掉所在的行数,去自己代码看看吧。
6、总结
根据lr的地址值的大小可以大体定位出问题是处在进程中还是库中,如果是进程的话,直接addr2line -e test 地址 就可以定位了。不需要Maps信息了。值是很大的一个值的时候, 就是库的报错,库的定位相对复杂些需要Maps信息找到偏移量来定位。