栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【c++ debug】protoBuf读写碰到的coredump问题记录

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【c++ debug】protoBuf读写碰到的coredump问题记录

问题
  • 报错:msgDeque.pop_front()报coredump, 无internal_metadata

  • 代码: 消息读取代码pop元素时报错,如下

    std::lock_guard msgLock(msgDequeMutex);
    if (msgDeque.empty()) return;
    
    auto& msgItem = msgDeque.front(); 
    ...
    msgDeque.pop_front();	// 报coredump
    
原因
  • 分析: 网上查询该报错,涉及到protobuf反射的实现,即运行时自身状态的访问与修改。反射依赖于internal_meta元信息,元信息是系统自描述信息,用于描述系统本身,即系统有哪些类、哪些字段、哪些方法、字段属于什么类型等等。如果字段未被赋值就去析构,很可能报coredump

  • 原因: 检查发现,消息写入时未加互斥锁导致该报错。因为用了互斥锁进行读写同步,proto初始化但未写入时,internal_metadata未被赋值,直接去析构就会报错

解决
  • 像这种需要读写保护的变量,写入和读取的地方都不要忘记加锁
拓展
  • 类似报错还有:message.has_header()的internal_header报coredump
  • deque对象为empty时的访问行为是未定义的,也会出现段错误,所以在访问前应加dequeIns.empty()校验!
  • 容器对象作为引用传递时可能会出现迭代器失效问题,使用时也要注意防范

 


参考文章:
deque为空时候访问行为未定义
容器作为引用传递迭代器失效问题
容器pop后引用失效问题

created by shuaixio, 2022.06.03

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/950170.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号