菜鸟笔记
提升您的技术认知

dmesg和addr2line命令定位段错误-ag真人游戏

$ dmesg -t  |grep brpc
[thu nov 25 14:39:53 2021] brpc[3714121]: segfault at 8 ip 0000000002497383 sp 00007ff8bb1fead0 error 6 in brpc[400000 37a2000]
[thu nov 25 14:40:43 2021] brpc[3740592]: segfault at 8 ip 0000000002497383 sp 00007fc2eb9fead0 error 6 in brpc[400000 37a2000]
$ addr2line -e ./brpc  0000000002497383 -f
_zn5butil8linknodein4bvar6detail13agentcombinerimmns2_5addtoimeee5agentee12insertbeforeeps8_
/proc/self/cwd/external/com_github_brpc_brpc/src/butil/containers/linked_list.h:97
$ c  filt _zn5butil8linknodein4bvar6detail13agentcombinerimmns2_5addtoimeee5agentee12insertbeforeeps8_
butil::linknode >::agent>::insertbefore(butil::linknode >::agent>*)

一、dmesg命令

dmesg命令,用于获取程序出错时的堆栈地址,用grep过滤出发生崩溃的程序,以及对应的堆栈信息

[thu nov 25 14:39:53 2021] brpc[3714121]: segfault at 8 ip 0000000002497383 sp 00007ff8bb1fead0 error 6 in brpc[400000 37a2000]

字段说明:
a) ip: 指令指针寄存器,字段后面的数字就是程序出错时程序执行的位置
b) sp: 堆栈指针寄存器
c) error:错误码,由三个字位组成的,从高到底分别为bit2 bit1和bit0
bit2: 值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界
bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界
bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址

二、addr2line命令

将dmesg获取到的地址转换为代码中发成错误的文件、行号及函数名

addr2line -e 进程名 ip指令地址 -f

三、c filt命令

源码文件中的变量名和函数名被修饰后,通过 c filt 命令可以还原回来

网站地图