• 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 命令可以还原回来

  • 相关阅读:
    js分割字符串
    ES6解构赋值
    三句话简要介绍子网掩码
    文心一言 VS 讯飞星火 VS chatgpt (111)-- 算法导论10.2 2题
    Android NDK CMakeLists.txt 说明
    【Python_PySide2学习笔记(十七)】QPlainTextEdit末尾增加文本时设置文本颜色
    LabVIEW样式检查表3
    智慧社区电动车管理解决方案
    【scala】阶段性练习
    第5章 - 二阶多智能体系统的协同控制 --> 连续时间含时延系统一致性
  • 原文地址:https://blog.csdn.net/chen134225/article/details/125568879