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