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

news2025/1/20 1:51:11

文章目录

        • 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.coloradmin.cn/o/1455276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《隐私计算简易速速上手小册》第5章:隐私计算在不同行业的应用(2024 最新版)

文章目录 5.1 金融行业5.1.1 基础知识5.1.2 重点案例:欺诈检测系统5.1.3 拓展案例 1:信用评分模型5.1.4 拓展案例 2:市场趋势分析5.2 医疗保健行业5.2.1 基础知识5.2.2 重点案例:匿名化患者数据分析5.2.3 拓展案例 1:使用差分隐私进行临床试验数据分析5.2.4 拓展案例 2:安…

【机构vip教程】​python(1):python正则表达式匹配指定的字符开头和指定的字符结束

一&#xff0c;使用python的re.findall函数&#xff0c;匹配指定的字符开头和指定的字符结束 代码示例&#xff1a; 1 import re 2 # re.findall函数;匹配指定的字符串开头和指定的字符串结尾(前后不包含指定的字符串) 3 str01 hello word 4 str02 re.findall((?<e).*?…

大模型LLM训练显存消耗详解

参考论文&#xff1a;ZeRO: Memory Optimizations Toward Training Trillion Parameter Models 大模型的显存消耗一直都是面试常见的问题&#xff0c;这次我就彻彻底底的根据论文ZeRO中的调研和分析做一次分析 显存消耗的两个部分&#xff1a;Model States&#xff08;跟模型的…

【机构vip教程】Android SDK手机测试环境搭建

Android SDK 的安装和环境变量的配置 前置条件&#xff1a;需已安装 jdk1.8及 以上版本 1、下载Android SDK&#xff0c;解压后即可&#xff08;全英文路径&#xff09;&#xff1b;下载地址&#xff1a;http://tools.android-studio.org/index.php/sdk 2、新建一个环境变量&…

linux内核模块module_put()函数详解--03

对应module_put()函数详细用法分享。 第一&#xff1a;函数简介 //函数原型 void module_put(struct module * module) //函数功能 该函数功能是将一个特定模块module的引用计数减一 这样当一个模块的引用计数不为0而不能被内核卸载的 时候&#xff0c;可以调用该函数一次或多…

这样用TVS管

对于工程师来说&#xff0c;浪涌保护不仅仅是选择合适的电源板或者拔下几根电缆&#xff0c;主要涉及在 PCB 布局中放置瞬态保护组件并应用明确的接地策略。 TVS 二极管是用于保护PCB布局中组件的常用组件&#xff0c;这些组件放置在数据线上&#xff0c;一旦电路中接收到ESD脉…

出生医学证明档案管理系统

出生医学证明档案管理系统是一种用于管理和维护出生医学证明档案的软件系统。该系统可以帮助医院、出生登记机构和其他相关部门有效地管理和存储出生医学证明档案&#xff0c;提高工作效率和数据安全性。 专久智能出生医学证明档案管理系统的核心功能包括&#xff1a; 1. 档案管…

Linux超详细笔记

文章目录 Linux学习笔记操作系统Linux初识Linux的诞生Linux内核Linux发行版 虚拟机VMware安装远程连接Linux系统FinalShellFinalShell连接Linux WSL配置UbuntuLinux常用命令1.入门2.ls命令cd命令3.pwd命令4.相对路径和绝对路径5.mkdir命令6.文件操作命令&#xff08;1&#xff…

【机构vip教程】Charles(1):Charles的介绍及安装

Charles Charles 是在 Mac &#xff08;Charles是跨平台的 &#xff09;下常用的网络封包截取工具&#xff0c;在做移动开发、测试时&#xff0c;我们为了调试与服务器端的网络通讯协议&#xff0c;常常需要截取网络封包来分析。Charles是一个HTTP代理服务器,HTTP监视器,反转代…

从零开始的 dbt 入门教程 (dbt core 开发进阶篇)

引 在上一篇文章中&#xff0c;我们花了专门的篇幅介绍了 dbt 更多实用的命令&#xff0c;那么我们继续按照之前的约定来聊 dbt 中你可能会遇到的疑惑以及有用的概念&#xff0c;如果你是 dbt 初学者&#xff0c;我相信如下知识点一定会对你有极大的帮助&#xff1a; 了解 db…

【Linux篇】Linux项目自动化构建工具-make/Makefile

&#x1f49b;不要有太大压力&#x1f9e1; &#x1f49b;生活不是选择而是热爱&#x1f9e1; &#x1f49a;文章目录&#x1f49a; 什么是make/Makefilemakefile认识makefilemakefile的编写伪目标 Linux下多程序编译 什么是make/Makefile 在实际工作中&#xff0c;一个项目可能…

在职阿里6年,一个28岁女软件测试工程师的心声

简单的先说一下&#xff0c;坐标杭州&#xff0c;16届本科毕业&#xff0c;算上年前在阿里巴巴的面试&#xff0c;一共有面试了有6家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09; 其中成功的有4家&am…

芯片的分类

目录 通用处理器数字信号处理器专用处理器 通用处理器 我们常听说的中央处理器CPU就是一种典型的通用处理器&#xff08;GPP&#xff09;。这种处理器多使用片上系统&#xff08;SoC&#xff09;的设计理念&#xff0c;在处理器上集成各种功能模块&#xff0c;每一种功能都是用…

Python爬虫详解(一看就懂)

爬虫 爬虫是什么 爬虫简单的来说就是用程序获取网络上数据这个过程的一种名称。 爬虫的原理 如果要获取网络上数据&#xff0c;我们要给爬虫一个网址&#xff08;程序中通常叫URL&#xff09;&#xff0c;爬虫发送一个HTTP请求给目标网页的服务器&#xff0c;服务器返回数据…

thinkphp+vue企业产品展示网站f7enu

本文首先介绍了企业产品展示网站管理技术的发展背景与发展现状&#xff0c;然后遵循软件常规开发流程&#xff0c;首先针对系统选取适用的语言和开发平台&#xff0c;根据需求分析制定模块并设计数据库结构&#xff0c;再根据系统总体功能模块的设计绘制系统的功能模块图&#…

三防平板电脑丨亿道工业三防平板丨三防平板定制丨机场维修应用

随着全球航空交通的增长和机场运营的扩展&#xff0c;机场维护的重要性日益凸显。为确保机场设施的安全和顺畅运行&#xff0c;采取适当的措施来加强机场维护至关重要。其中&#xff0c;三防平板是一种有效的工具&#xff0c;它可以提供持久耐用的表面保护&#xff0c;使机场维…

基于Java+Jsp的超市积分管理系统

&#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩项目推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;希望帮…

300分钟吃透分布式缓存-01讲:业务数据访问性能太低怎么办?

这节课主要讲缓存的基本思想、缓存的优点、缓存的代价三个部分。 缓存的定义 先来看下缓存的定义。 & 缓存最初的含义&#xff0c;是指用于加速 CPU 数据交换的 RAM&#xff0c;即随机存取存储器&#xff0c;通常这种存储器使用更昂贵但快速的静态 RAM&#xff08;SRAM&…

lv15 input子系统框架、外设驱动开发 5

一、input子系统基本框架 在我们日常的Linux系统中&#xff0c;存在大量的输入设备&#xff0c;例如按键、鼠标、键盘、触摸屏、摇杆等&#xff0c;他们本身就是字符设备&#xff0c;linux内核将这些字符设备的共同性抽象出来&#xff0c;简化驱动开发建立了一个input子系统。 …

Springboot+vue的物流管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的物流管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的物流管理系统&#xff0c;采用M&#xff08;model&#xff09;…