在后端优化中遇到了段错误 (核心已转储)问题,寻求解决方法。
首先通过不断的注释部分代码,运行,注释,运行,找到一个大概的范围是错在哪一块。

这类问题只能说根本原因是内存的非法操作。建议生成内存段错误转储文件,发生段错误后用gdb分析该文件定位到发生段错误的代码上,这样才能确定导致段错误的直接原因。 -国庆

GDB大法好,直接定位到相关的信息上去,使用gdb ggoLearning 进入调试界面

gdb ggoLearning
GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ggoLearning...done.

进入(gdb)调试界面,输入r,可以运行程序,可以看到程序在运行的时候,出现了Program received signal SIGSEGV, Segmentation fault.错误。

当程序出现异常时通常伴随着会收到一个由内核发过来的异常信号,如当对内存出现非法访问时将收到段错误信号SIGSEGV,然后才退出。利用这一点,当我们在收到异常信号后将程序的调用栈进行输出,它通常是利用signal()函数,关于系统信号的

(gdb) r
Starting program: /home/user/work/x/rgbd-slam-tutorial-gx/partI/bin/ggoLearning
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
RMSE for the structure is:                0.00825072
RMSE for the rotation of camera is:       0.0478788
RMSE for the translation of camera is:    0.0220988Program received signal SIGSEGV, Segmentation fault.
0x00007ffff75e6267 in g2o::BaseVertex<6, g2o::SE3Quat>::pop() ()from /home/user/work/x/rgbd-slam-tutorial-gx/partI/include/g2o/lib/libg2o.so

bt可以看到程序的好几层,使用backtrace回溯定位问题。这里有一个例子:在Linux中如何利用backtrace信息解决程序崩溃的问题

(gdb) bt
#0  0x00007ffff75e6267 in g2o::BaseVertex<6, g2o::SE3Quat>::pop() ()from /home/user/work/x/rgbd-slam-tutorial-gx/partI/include/g2o/lib/libg2o.so
#1  0x00007ffff7620a78 in g2o::SparseOptimizer::pop(std::vector<g2o::OptimizableGraph::Vertex*, std::allocator<g2o::OptimizableGraph::Vertex*> >&) ()from /home/user/work//rgbd-slam-tutorial-gx/partI/include/g2o/lib/libg2o.so
#2  0x00007ffff7629be2 in g2o::OptimizationAlgorithmLevenberg::solve(int, bool)()from /home/user/work/x/rgbd-slam-tutorial-gx/partI/include/g2o/lib/libg2o.so
#3  0x00007ffff76219cd in g2o::SparseOptimizer::optimize(int, bool) ()from /home/user/work/xio/rgbd-slam-tutorial-gx/partI/include/g2o/lib/libg2o.so
#4  0x000055555581f5a0 in SolveBA (vNoisyCameras=std::vector of length 3, capacity 3 = {...}, vpNoiseGeometryFeatures=std::vector of length 2, capacity 2 = {...})at /home/user/work/x/rgbd-slam-tutorial-gx/partI/src/ggoLearning.cpp:477
#5  0x000055555581c4bd in main (argc=1, argv=0x7fffffffdd18)at /home/user/work/x/rgbd-slam-tutorial-gx/partI/src/ggoLearning.cpp:123
(gdb) frame 5
#5  0x000055555581c4bd in main (argc=1, argv=0x7fffffffdd18)at /home/user/work/x/rgbd-slam-tutorial-gx/partI/src/ggoLearning.cpp:123
warning: Source file is more recent than executable.
123     SolveBA(vNoisyCameras,vNoisyGeomeryPlaneFeatures);

我们一般使用各类的库

(gdb) frame 4
#4  0x000055555581f5a0 in SolveBA (vNoisyCameras=std::vector of length 3, capacity 3 = {...}, vpNoiseGeometryFeatures=std::vector of length 2, capacity 2 = {...})at /home/user/work/xinguo/rgbd-slam-tutorial-gx/partI/src/ggoLearning.cpp:477
477     optimizer.optimize(10);
(gdb) 

输入quit或者按下Ctrl-d退出

调试到后面发现进入了汇编语言界面,。。。

HLT 使 CPU 进入这么一个状态:既不取指令,也不读写数据,总线上“静悄悄”的。这条指令
用的地方不多,一般用于等外部中断。

c++如何解决段错误 (核心已转储)相关推荐

  1. linux下gdb使用core文件调试程序,解决“段错误核心已转储“的问题

    一.core文件介绍以及用途: 1.core文件是什么? core文件包含了程序运行时的内存状态.寄存器状态.堆栈指针.内存管理信息以及各个函数使用堆栈信息等等: 当程序运行过程中出现段错误(Segm ...

  2. Ubuntu20.04出现段错误核心已转储问题解决方案

    作为一个半路出家的linuc用户,coredump这个问题太让人抓狂了,网上找了好多都是不全面,不适应或者看不懂:现在终于解决了,记录一下防止以后出现还是无解,同时也分享给大家,希望大家能少踩一些坑. ...

  3. c语言 段错误 核心已转移,c语言使用DES_ncbc_encrypt以及段错误 (核心已转储) 解决...

    1.首先安装ssl库文件 sudo apt-get install libssl-dev 引入头文件 #include 2.定义调用方法 void call_cbc(){ DES_cblock key ...

  4. 段错误 (核心已转储)_向大厂看齐!为自己的程序增加自动转储的功能!

    如果你还不清楚什么是转储文件,不知道什么时候需要转储文件,请参考转储文件系列文章的第一篇 -- 转储文件知多少. 前言 不知道各位小伙伴有没有遇到过 微信 或者 QQ 崩溃的情况.它们在崩溃的时候都会 ...

  5. 运行orbslam2出现 段错误 (核心已转储)_JDK 14已发布快速预览16个新特性

    JDK 14已经于2020年3月17日如期发布.本文介绍JDK 14特性. JEP 305: instanceof的模式匹配(预览) 通过对instanceof运算符进行模式匹配来增强Java编程语言 ...

  6. mysql出现core dumped_mysql-为什么我遇到分段错误(核心已转储)?

    这是我要运行的代码.它可以编译,并且工作良好,直到昨天. #include #include int main(int argc, char **argv) { MYSQL *conn; MYSQL_ ...

  7. 段错误(核心已转储)的原因

    一.什么是段错误? 一旦一个程序发生了越界访问,cpu 就会产生相应的保护,于是 segmentation fault 就出现了,通过上面的解释,段错误应该就是访问了不可访问的内存,这个内存区要么是不 ...

  8. C语言再学习 -- 段错误(核心已转储)

    参看:Linux下的段错误产生的原因及调试方法 参看:Linux环境下段错误的产生原因及调试方法小结 参看:维基百科--Segmentation fault 参看:LINUX内核段错误调试详细指南精品 ...

  9. Ubuntu 20 core dumped(核心已转储)问题分析

    问题原因: core 指核心(线圈),没有半导体之前,使用线圈内存,指代内存. 可执行文件是分段存储的,加载进内存也是分段的,如代码段.数据段.堆.栈等,段错误的原因往往是碰到了不该碰到的内存位置(如 ...

最新文章

  1. 计算机和人类“看”法不同,但这重要么?
  2. MySQL复制经常使用拓扑结构具体解释
  3. Google Maps Android API V2的使用及问题解决
  4. 离职后,我们该如何处理社保!
  5. 单点登录的原理与CAS技术的研究
  6. android--在命令行中生成Android的数字证书keystore文件
  7. (计算机组成原理)第二章数据的表示和运算-第一节2:BCD码
  8. [Android]对MVC和MVP的总结
  9. Alibaba Canal
  10. node.js 处理 http 请求
  11. mysql key语句_mysql建表语句key的含义
  12. 导致301状态码的可能的原因
  13. 数字通信技术知识点二
  14. hacking 麦步手表之(3)制作一个英文表盘xzy-reborn
  15. 如何取得销售订单中订单货币和本位币之间的汇率 (exchange rate)
  16. 最强大脑王昱珩,一个近乎完美的男人
  17. 概率机器学习中的互信息(Mutual Information)
  18. 给Ubuntu系统清理垃圾
  19. C++程序设计基础之(第三章)函数
  20. 【破茧成蝶-用户体验设计】读书笔记

热门文章

  1. html5发送信息给微信朋友圈,微信朋友圈怎么发纯文字信息 怎样在朋友圈发纯文字。...
  2. Pylint pylint设置不检查项
  3. linux 获取phy状态,Linux PHY几个状态的跟踪
  4. 5G云游戏的到来是否会对单机游戏产生影响
  5. ensp启动设备蓝屏_电脑硬件:蓝屏的常见解决方案
  6. webpack 4 热更新后台成功更新浏览器不刷新
  7. 什么是梯度消失和梯度爆炸及如何解决
  8. 精益生产管理如何在企业落地?
  9. linux 终端给进程输入法,Linux 输入法设置
  10. FANUC机器人的通讯方式(1)