• linux addr2line 用于定位程序崩溃使用


    1、编译项添加-Wall -g ;如 cmake 3.12 版本后使用 add_compile_options(-Wall -g),之前的版本用add_definitions("-Wall -g")。

    2、出现崩溃时,使用dmesg 显示出现错误的地方。

    我这里把错误的地方放在库里,报错的地方如下所示

    traps: test_node[65242] trap divide error ip:7fb21a604942 sp:7fff55eacf10 error:0 in libdevide.so[7fb21a604000+1000]

    这里提示在库里报错了,正确的地址是7fb21a604942 - 7fb21a604000  = 0x942

    然后输入命令

    addr2line 0x942 -e libdevide.so

    结果:
    xxxxxxxxxxxxdevide.cpp:7

    4、出现  ?的原因有几点:

    1)编译的时候要加1的编译选项。

    2)地址是 pi 减去 后面那个地址。

    3)addr2line 的对象要找对,比如我的应用程序叫做test_node,但是崩溃的时候提示在libdevide.so,这时候addr2line 的对象是libdevide.so

    4) 可以用readelf -w 对象   ,查看更多的信息。

    文件1:devide.h

    #include<iostream>

    void devide();
    void show();

    文件2:devide.cpp

    #include "devide.h"


    void devide()
    {
    show();
    double t = 9/0; //这里设置崩溃的位置点(第7行)
    std::cout<<"t"<<t<<std::endl;
    }

    void show()
    {
    std::cout<<" test1"<<std::endl;
    std::cout<<" test1"<<std::endl;
    std::cout<<" test1"<<std::endl;
    std::cout<<" test1"<<std::endl;
    std::cout<<" test1"<<std::endl;
    }

    文件3:main.cpp

    #include <iostream>
    #include "devide.h"
    int main()
    {
    std::cout<<"hello"<<std::endl;
    int vec[9];
    devide();
    std::cout<<"hello"<<std::endl;
    return 0;
    }

  • 相关阅读:
    oracle数据库导出与导入
    Mysql导入表信息[Err] 1067
    Golang--不定参数类型
    (转)Docker容器的重启策略及docker run的--restart选项详解
    (转)Golang--使用iota(常量计数器)
    Golang--匿名变量
    Golang--Hello World
    Ubuntu Server16.04 配置网卡
    U盘安装ubuntu 16.04 遇到 gfxboot.c32:not a COM32R image boot 的解决方法
    ipfs私链服务
  • 原文地址:https://www.cnblogs.com/kabe/p/16333376.html
Copyright © 2020-2023  润新知