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;
}

 

posted on 2022-06-01 10:15  卡贝天师  阅读(668)  评论(0编辑  收藏  举报