网站建设公司盈利分析,亚马逊关键词工具哪个最准,网站备案背景幕布下载,如何生成自己的网站段错误的愿意和调试方法
主要的原因#xff1a;
访问了不存在的内存指针访问系统保护的内存地址方位只读的内存地数组越界栈溢出
主要查看#xff0c;指针的问题是否出现错误使用
方法1. gdb直接调试
使用run命令直接报错#xff0c;查看
方法2. 调试core文件#xf…段错误的愿意和调试方法
主要的原因
访问了不存在的内存指针访问系统保护的内存地址方位只读的内存地数组越界栈溢出
主要查看指针的问题是否出现错误使用
方法1. gdb直接调试
使用run命令直接报错查看
方法2. 调试core文件
当程序运行的过程中异常终止或崩溃操作系统会将程序当时的内存状态记录下来保存在一个文件中这种行为就叫 core dump核心转储。
2.1 打开 core dump 功能
终端输入 ulimit -c如果输出 0说明core的文件大小为0也即没有开启 core dump 功能
不限制 core dump 存储信息的大小可以执行 ulimit -c unlimited限制 core dump 大小可以执行单位是 KB ulimit -c 10242.2 永久修改可选
以上指令只对当前终端有效想要永久生效需要修改 “/etc/security/limits.conf” 文件重启后生效 sudo vim /etc/security/limits.confgdb ./执行文件 ./core结果告诉出错的位置会生成当前目录下
2.3 修改 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 文件了
参数表
%p - insert pid into filename 添加pid(进程id)%u - insert current uid into filename 添加当前uid(用户id)%g - insert current gid into filename 添加当前gid(用户组id)%s - insert signal that caused the coredump into the filename 添加导致产生core的信号%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间%h - insert hostname where the coredump happened into filename 添加主机名%e - insert coredumping executable name into filename 添加导致产生core的命令名
2.4 程序添加 gdb 调试信息
catkin_make 编译 catkin_make -DCMAKE_BUILD_TYPEDebug或者在 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 文件
2.5 执行这句话即可 gdb /devel/lib/xxx.so xxx-core参考https://zhuanlan.zhihu.com/p/655272437
方法3. 反汇编定位
3.1 使用dmseg命令定位出现段错误的输出信息的地址
demsg
即出现对应的段错误的指令指针对应的地址记住这个地址3.2 或者使用catchsegv定位错误地址
catchsegv ./可执行程序3.3 反汇编进行查看
使用 objdump -S ./可执行程序logdump根据出错的段错误地址确定出错的位置
总结
出现段错误的时候首先想一想段错误的定义出现的原因编程的时候定义变量最好初始化数组不越界使用
其他报错 循环使用出现段错误查看你的频率和休眠时间是否对应 double free问题等待补充 在使用ceres/g2o报错时在cmakeList.txtset(CMAKE_CXX_FLAGS “-stdc11 -marchnative -O3”) 可以参考https://blog.csdn.net/weixin_46120107/article/details/130663182
set(CMAKE_CXX_FLAGS -stdc11 -marchnative -O3)native 就是相当于自检查cpu,
-march是gcc优化选项,
-Ox 这个参数只有在 cmake -DCMAKE_BUILD_TYPErelease时有效