主要的原因:
主要查看,指针的问题是否出现错误使用
使用run命令直接报错,查看
当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫 core dump(核心转储)。
终端输入:
ulimit -c
如果输出 0,说明,core的文件大小为0,也即没有开启 core dump 功能
不限制 core dump 存储信息的大小,可以执行:
ulimit -c unlimited
限制 core dump 大小,可以执行(单位是 KB):
ulimit -c 1024
以上指令只对当前终端有效,想要永久生效需要修改 “/etc/security/limits.conf” 文件,重启后生效
sudo vim /etc/security/limits.conf
gdb ./执行文件 ./core,结果告诉出错的位置,会生成当前目录下
默认情况下,内核在 core dump 时所产生的 core 文件放在与该程序相同的目录中,并且文件名固定为 core
执行下面指令修改 core 文件路径:
echo /tmp/crash/core-%e-%t | sudo tee /proc/sys/kernel/core_pattern
其中 “/tmp/crash/core-%e-%t” 是 core dump 文件的保存路径和命名
注意:这里的 “/tmp/crash/” 目录如果不存在,程序崩溃时候不会自动创建 “/tmp/crash/” 目录,也就不会保存 core dump 文件了
参数表:
catkin_make 编译:
catkin_make -DCMAKE_BUILD_TYPE=Debug
或者在 CMakelist.txt 文件前面添加以下代码
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
当程序运行崩溃后,会在 “/tmp/crash/” 目录中产生 core dump 文件
gdb /devel/lib/xxx.so xxx-core
参考https://zhuanlan.zhihu.com/p/655272437
demsg
即出现对应的段错误的指令指针对应的地址,记住这个地址
catchsegv ./可执行程序
使用 objdump -S ./可执行程序>logdump
根据出错的段错误地址,确定出错的位置
循环使用,出现段错误:查看你的频率和休眠时间是否对应;
double free问题:等待补充;
在使用ceres/g2o报错时,在cmakeList.txt,set(CMAKE_CXX_FLAGS “-std=c++11 -march=native -O3”) 可以参考https://blog.csdn.net/weixin_46120107/article/details/130663182
set(CMAKE_CXX_FLAGS "-std=c++11 -march=native -O3")
===>
native 就是相当于自检查cpu,
-march是gcc优化选项,
-Ox 这个参数只有在 cmake -DCMAKE_BUILD_TYPE=release时有效