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

dmesg和addr2line命令定位段错误

$ 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<bvar::detail::AgentCombiner<unsigned long, unsigned long, bvar::detail::AddTo<unsigned long> >::Agent>::InsertBefore(butil::LinkNode<bvar::detail::AgentCombiner<unsigned long, unsigned long, bvar::detail::AddTo<unsigned long> >::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 命令可以还原回来