【c++ debug】记一次protobuf结构相关的coredump问题

文章目录

        • 1. 问题现象
        • 2. 问题描述
        • 3. 问题分析
        • 4. 问题根因
        • 5. 问题修复
        • 6. 补充:类成员变量定义为引用类型

1. 问题现象
  • 其中curr_lanes是一个目标上一帧的当前车道current_lanes_
  • curr_lane是lane_id对应的LaneInfo信息
  • 现象:在lane_info->lane().successor_id_size()或lane_info->lane().successor_id().size()为1的情况下,通过for循环去访问lane_info->lane().successor_id()的时候出现了coredump
2. 问题描述
  • (1) 问题必现,问题现象自相矛盾。size为1但是却无法访问,按理来说如果可迭代对象使用for循环访问,为空的情况是不会出问题的,for循环就跳过了

  • (2) 类Lane_info的结构,其中Lane是protobuf结构,如下

    class LaneInfo {
    	const Lane &lane_;		// 所包含的lane的信息, 居然定义的是引用
        {
            id_;
    		   length_;
    		   type_;
    		   turn_;
    		   successor_ids_;
    		   predecessor_ids_;};
    	points;
    	unit_directions_;
    	segments_;
    	total_length_;
    	road_id;};
    
3. 问题分析
  • (1)怀疑Lane的proto实例创建时add_successor_id没有添加成功
    • 检查发现添加方式没有问题,从地图收到的successor_id也不为空,正常填写的
  • (2)怀疑LaneInfo实例没有创建成功
    • 添加打印发现,LaneInfo创建过程未出现失败
  • (3)怀疑是智能指针引用问题
    • std::shared_ptr指针指向内容被异常释放,检查下来也没发现
  • (4)怀疑是引用的原变量已经不在了,仍然尝试去访问
    • 检查发现就是这个原因。LaneInfo类中的&lane_引用很关键
4. 问题根因
  • 满足地图更新条件时,上一次的map_结果会被清理(智能指针管理);但是目标上一帧的current_lanes(类型是LaneInfo)仍去索引lane_信息
  • 问题发生过程
    • (1) 第一次地图更新时,创建了static_map_->hdmap_->{map_, lanes_}的关联关系。其中lanes_结构:<lane_id, LaneInfo>
    • (2)目标第一帧的current_lanes根据static_map_记录了当时的<lane_id, LaneInfo>信息,且由于是proto结构,LaneInfo中copy了&lane_的信息,对应的proto字段bit均已赋值,比如has_successor_id字段、succcessor_id_size字段等;本次访问没问题
    • (3)第二次更新地图时,static_map_关联到了新的hdmap_,即static_map_->new_hdmap_->{map_, lanes_}的关联关系,此时lanes信息已完全变更
    • (4)目标第二帧再去访问第一帧的current_lanes_发现lane proto的successor_id_size有效但是去访问successor_id的时候却找不到原变量,因此失败。即被引用对象已被删除
5. 问题修复
  • (1)static_map_全程只关联一个hdmap_,每次地图更新也只更新该hdmap_。这里的static_map_是一个伪静态类
  • (2)static_map_->hdmap->{map_, lanes_}中的lanes_不做清理,避免重复构建相同lane的LaneInfo,也避免在查询目标前后继车道的过程中出现异常,如目标已记录的successor_id在已更新的地图lanes_中却找不到
6. 补充:类成员变量定义为引用类型
  • (1)C++初始化包括声明时即定义,或者在初始化列表中进行初始化。构造函数分为初始化列表和函数体
  • (2)C++类成员变量定义为引用类型,不能用默认函数初始化,必须定义构造函数来初始化引用成员变量,否则会报引用未初始化错误
  • (3)构造函数的形参也必须是引用类型,如LaneInfo(const Lane& lane) : lane_(lane) {}
    防止引用绑定内存错误,在构造函数结束后所指向内存生命周期已结束,会有问题
  • (4)不能在构造函数里初始化,必须在初始化列表中进行初始化
  • (5)初始化后的引用变量所占用的内存空间和普通变量相同,可通过类的大小进行测试

 


【参考文章】
[1]. c++之类内定义引用成员
[2]. 引用变量所占用的内存空间
[3]. C++类成员变量定义为引用

created by shuaixio, 2024.02.18

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/394149.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu22.04上作业调度管理软件PBS Torque的安装、配置及主要使用方法

文章目录 前言一、PBS及Torque是什么&#xff1f;二、Ubuntu22.04上Torque的安装和配置步骤1. 更新系统软件包2. 安装必要的软件包3. 下载和安装Torque4. 配置Torque5. 设置环境变量6. 配置和启动Torque服务7. 配置计算节点8. 创建队列的信息&#xff0c;名称 batch0019. 提交测…

在ubuntu中制作ubuntu的U盘启动盘

概要&#xff1a; 本篇演示在ubuntu22.04中制作ubuntu22.04的U盘启动盘 一、下载ubuntu22.04的iso文件 访问ubuntu官网https://ubuntu.com自行下载ubuntu官网 二、制作U盘启动盘 打开系统自带软件Startup Disk Creator 软件会自动检测iso文件和U盘 点击Make Startup Disk…

五、全局scss变量定义及使用

定义 variable.scss 存放全局变量 // base color $blue:#324157; $light-blue:#3A71A8; $red:#C03639; $pink: #E65D6E; $green: #30B08F; $tiffany: #4AB7BD; $yellow:#FEC171; $panGreen: #30B08F;// 默认菜单主题风格 $base-menu-color:#bfcbd9; $base-menu-color-active:#f…

【HarmonyOS】鸿蒙开发之Text组件——第3.2章

text组件属性介绍 textAlign有三种属性start(默认),end,center Column(){//默认文字大小16Text("迪加奥特曼").width(200)Text().margin({top:10,bottom:10})Text("泰罗奥特曼").width(200).fontSize(26).fontColor(Color.Red).textAlign(TextAlign.End)…

ElasticSearch之Mapping

写在前面 本文看下es的mapping的设置。es支持两种mapping&#xff0c;一种式dynamic mapping&#xff0c;另外一种是显式的mapping设置。分别来看下。 在正式开始之前我们需要先看下es提供的字段数据类型: 1&#xff1a;dynamic mapping 我们在使用关系型数据库的时候必须…

图数据库 之 Neo4j - 应用场景1(6)

Neo4j是一种图数据库&#xff0c;它专注于处理关系数据密集型的问题。由于其图结构的特性&#xff0c;Neo4j能够高效地存储、查询和分析连接数据。 以下是一些常见的Neo4j应用场景&#xff1a; 社交网络分析&#xff1a;通过建模和分析人际关系&#xff0c;可以揭示社交网络中…

Linux-系统资源管理的命令

目录 查看CPU&#xff1a;more /proc/meminfo 查看内存数据&#xff1a;free -m / free -h 查看系统版本&#xff1a;more /etc/issue 查看操作系统的类型&#xff1a;uname -a 查看主机名称&#xff1a;hostname 查看磁盘空间&#xff1a;df -h 查看某个目录空间…

防御保护---防火墙综合实验

拓扑图 实验要求 办公区的设备可以通过电信链路和移动链路上网分公司设备可以通过总公司的移动链路和电信链路访问到DMZ区域的HTTP服务器分公司内部的客户端可以通过公网地址访问到内部的服务器FW1和FW2组成主备模式双击热备办公区上网用户限制流量不超过60M&#xff0c;其中销…

海外媒体发稿:8个提升影响力的日韩地区媒体发稿推广策略-华媒舍

在今天的数字化时代&#xff0c;媒体发稿推广成为企业和个人增加影响力的重要方式。特别是在日韩地区&#xff0c;这个拥有庞大媒体市场和活跃社交媒体用户的地区&#xff0c;正确的推广策略将对影响力的提升起到关键作用。我们将介绍8个提升影响力的日韩地区媒体发稿推广策略。…

从零开始学逆向:理解ret2syscall

1.题目信息 链接&#xff1a;https://pan.baidu.com/s/19ymHlZZmVGsJHFmmlwww0w 提取码&#xff1a;r4el 首先checksec 看一下保护机制 2.原理 ret2syscall 即控制程序执行系统调用来获取 shell 什么是系统调用&#xff1f; 操作系统提供给用户的编程接口是提供访问操作系统…

辽宁博学优晨教育科技有限公司视频剪辑培训专业之选

随着数字时代的到来&#xff0c;视频剪辑技术已成为各行各业不可或缺的一项技能。为了满足市场需求&#xff0c;辽宁博学优晨教育科技有限公司&#xff08;以下简称“博学优晨”&#xff09;推出了专业的视频剪辑培训课程&#xff0c;旨在为广大学员提供系统、高效的学习机会。…

基于 Amazon EC2 和 Amazon Systems Manager Session Manager 的堡垒机的设计和自动化实现

1. 背景 在很多企业的技术实现中&#xff0c;由于数据安全和合规性要求&#xff0c;大部分的应用服务都部署在私有云环境或专用网络中。为了满足开发人员和运维团队从本地数据中心安全访问云上资源的需求&#xff0c;采用堡垒机作为一种有效的解决方案变得尤为重要。 堡垒机的…

win家庭中文版支持远程桌面

win11家庭版不支持远程桌面&#xff0c;需要下载RDP Wrap补丁 链接&#xff1a;https://pan.baidu.com/s/1Q1MgoBB0v7_rAnR89snT_g 提取码&#xff1a;navi 一、安装RDP Wrap 1、解压RDPWrap-v1.6.2.zip&#xff0c;以管理员身份运行install.bat 2、双击RDPConf.exe&#xff…

考研证件照可以自己用手机拍吗?考研证件照p过可以通过审核吗?考研证件照有什么要求

一、考研证件照可以自己用手机拍吗 现在的智能手机相机技术先进&#xff0c;大多都配备了高像素摄像头&#xff0c;使得自拍照片的质量有了大幅提升。相较于传统的证件照拍摄&#xff0c;使用手机自拍考研证件照理论上是可行的。然而&#xff0c;考研证件照需要满足一定的规定…

鸿蒙应用模型开发-更新SDK后报错解决

更新SDK后提示 “ohos.application.Ability”/“ohos.application.AbilityStage”等模块找不到或者无相关类型声明 问题现象 更新SDK后报错“Cannot find module ‘ohos.application.AbilityStage’ or its corresponding type declarations”&#xff0c;“Cannot find modu…

Rust-知多少?

文章目录 前言1.使用下划线开头忽略未使用的变量2. 变量解构3.常量4.变量遮蔽&#xff08;shadowing&#xff09;5. 类似println!("{}", x); 为啥加感叹号6.单元类型总结 前言 Rust 学习系列&#xff0c;记录一些rust使用小技巧 1.使用下划线开头忽略未使用的变量 …

【STM32 物联网】AT指令与TCP,发送与接收数据

文章目录 前言一、连接TCP服务器1.1 配置Wifi模式1.2 连接路由器1.3 查询ESP8266设备IP地址1.4 连接TCP服务器 二、向服务器接收数据和发送数据2.1 发送数据2.2 接收数据 总结 前言 随着物联网&#xff08;IoT&#xff09;技术的迅速发展&#xff0c;越来越多的设备和系统开始…

java的泛型【详解】

定义类、接口、方法时&#xff0c;同时声明了一个或者多个类型变量&#xff08;如&#xff1a;<E>&#xff09; &#xff0c;称为泛型类、泛型接口&#xff0c;泛型方法、它们统称为泛型。 作用&#xff1a;泛型提供了在编译阶段约束所能操作的数据类型&#xff0c;并自…

Mac M1芯片编译openjdk报错问题解决

使用命令&#xff1a; sudo sh configure --with-target-bits64 用mac m1芯片编译openjdk一直报错&#xff1a; configure: The tested number of bits in the target (64) differs from the number of bits expected to be found in the target (32) configure: error: Cann…

C++ 调用js 脚本

需求&#xff1a; 使用Qt/C 调用js 脚本。Qt 调用lua 脚本性能应该是最快的&#xff0c;但是需要引入第三方库&#xff0c;虽然也不是特别麻烦&#xff0c;但是调用js脚本&#xff0c;确实内置的功能&#xff08;C 调用lua 脚本-CSDN博客&#xff09; 步骤&#xff1a; 1&…
最新文章