ORB-SLAM3集成自定义应用时KeyFrame::GetImuPosition()段错误排查
问题
将ORB-SLAM3与自定义应用集成运行时,出现Segmentation fault问题。生成核心转储并查看堆栈跟踪后,发现问题出在KeyFrame::GetImuPosition()中,且存在空指针访问(this@entry=0x0)。
堆栈跟踪信息如下:
Program terminated with signal SIGSEGV, Segmentation fault. #0 __GI___pthread_mutex_lock (mutex=0x1100) at ../nptl/pthread_mutex_lock.c:67 67 ../nptl/pthread_mutex_lock.c: No such file or directory. [Current thread is 1 (Thread 0x7f5c317fc700 (LWP 1926529))] (gdb) bt #0 __GI___pthread_mutex_lock (mutex=0x1100) at ../nptl/pthread_mutex_lock.c:67 #1 0x00007f5ce49502df in __gthread_mutex_lock (__mutex=0x1100) at /usr/include/x86_64-linux-gnu/c++/9/bits/gthr-default.h:749 #2 std::mutex::lock() (this=0x1100) at /usr/include/c++/9/bits/std_mutex.h:100 #3 std::unique_lock<std::mutex>::lock() (this=<synthetic pointer>, this=<synthetic pointer>) at /usr/include/c++/9/bits/unique_lock.h:141 #4 std::unique_lock<std::mutex>::unique_lock(std::mutex&) (__m=..., this=<synthetic pointer>) at /usr/include/c++/9/bits/unique_lock.h:71 #5 ORB_SLAM3::KeyFrame::GetImuPosition() (this=this@entry=0x0) at /home/my-user/workspace/my-project/ORBSlam3/src/KeyFrame.cc:150 #6 0x00007f5ce4a56e44 in ORB_SLAM3::ImuCamPose::ImuCamPose(ORB_SLAM3::KeyFrame*) (this=0x7f5c317b0380, pKF=0x0) at /home/my-user/workspace/my-project/ORBSlam3/src/G2oTypes.cc:28 #7 0x00007f5ce49a559a in ORB_SLAM3::VertexPose::VertexPose(ORB_SLAM3::KeyFrame*) (this=0x7f5bec463c40, pKF=0x0) at /home/my-user/workspace/my-project/ORBSlam3/include/G2oTypes.h:136 #8 0x00007f5ce499140e in ORB_SLAM3::Optimizer::PoseInertialOptimizationLastKeyFrame(ORB_SLAM3::Frame*, bool) (pFrame=pFrame@entry=0x7f5c66729240, bRecInit=bRecInit@entry=false) at /usr/include/eigen3/Eigen/src/Core/util/Memory.h:212 #9 0x00007f5ce48fcb09 in ORB_SLAM3::Tracking::TrackLocalMap() (this=0x7f5c66729230) at /home/my-user/workspace/my-project/ORBSlam3/src/Tracking.cc:3155 #10 0x00007f5ce49027f0 in ORB_SLAM3::Tracking::Track() (this=0x7f5c66729230) at /home/my-user/workspace/my-project/ORBSlam3/src/Tracking.cc:2292 ... project specific stack frames ..
应用和SLAM跟踪在运行数分钟、处理1000+帧后才出现该段错误,请问可能的原因是什么?
可能的原因分析
- 空指针传入优化模块:从堆栈可见,
VertexPose构造函数接收的pKF=0x0,说明PoseInertialOptimizationLastKeyFrame尝试获取上一关键帧时得到空指针。运行数分钟后出现该问题,排除未初始化的情况,更可能是关键帧被提前释放或多线程下指针失效。 - 关键帧生命周期管理错误:ORB-SLAM3的关键帧由跟踪、局部建图、闭环检测多线程共享。若自定义应用手动释放关键帧,或多线程同步时未正确保护关键帧指针,会导致某线程访问已销毁的关键帧(指针变为空或野指针)。比如局部建图线程删除关键帧后,跟踪线程仍持有旧指针并尝试访问。
- 多线程同步缺陷:
KeyFrame::GetImuPosition()需锁定互斥量,但堆栈显示尝试锁定的mutex=0x1100为非法地址,结合this=0x0,说明调用该方法时KeyFrame对象已不存在。这是多线程下未保证关键帧指针有效性导致的:比如跟踪线程使用指针前未做空指针检查,或局部建图线程已删除关键帧,但跟踪线程逻辑未处理该场景。 - 重初始化的边界逻辑疏漏:若运行中出现跟踪丢失后重新初始化,可能存在上一关键帧未正确设置的情况,导致
PoseInertialOptimizationLastKeyFrame获取到空关键帧指针。需检查跟踪模块重初始化后的关键帧衔接逻辑。 - 自定义集成的逻辑错误:若自定义应用修改了ORB-SLAM3的关键帧生成、存储逻辑,比如错误清空关键帧列表,或传递关键帧指针时未正确保留引用计数(ORB-SLAM3用智能指针管理关键帧),会导致关键帧被提前销毁,进而引发空指针访问。
内容的提问来源于stack exchange,提问作者MsA
相关产品推荐
相关产品推荐

