• 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>*)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    一、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
    
    • 1

    三、c++filt命令

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

  • 相关阅读:
    【MySQL】事务
    【计算机网络】网络原理
    大数据——Scala 元组
    如何使用C/C++刷新在终端上已经打印的内容
    【Python数据分析 - 6】:Numpy中的逻辑运算
    【c++刷题Day3】专题5数组标记&哈希T3
    进程创建时自动打开的三个文件描述符
    Java项目:springboot医院管理系统
    7.git冲突的产生与解决
    stm32之看门狗
  • 原文地址:https://blog.csdn.net/chen134225/article/details/125568879