动态Proto库ABI兼容性问题引发内存分配崩溃
Protobuf动态库ABI兼容性测试中的内存分配崩溃问题
环境信息
- 使用版本:protobuf v3.19.6,语言:C++
- 操作系统:Linux Ubuntu 20.04.6
- 编译器:gcc 9.4.0,构建工具:bazel 6.5.0(通过
cc_shared_library搭配cc_import构建动态链接库)
测试程序结构
程序拆分为多个动态库组件:
MessageClass库:基于Proto定义,包含两个string类型字段version和messageClass1库:负责创建MessageClass对象并传递给Class2Class2库:接收并处理MessageClass对象- 独立的通信类及主入口模块
崩溃复现步骤
- 构建完整程序,备份生成的
Class1动态库文件 - 修改
MessageClass的proto定义,在末尾添加一个字段号更大的测试字段,重新构建整个程序 - 用备份的旧
Class1库替换新构建生成的Class1库 - 运行程序,触发核心转储
崩溃现象
- 错误提示:
malloc(): invalid size (unsorted),崩溃发生在Class1的内存分配环节 - 通过gdb定位,以下场景会触发崩溃:
- 在
Class1成员函数中定义长度超过16的std::string - 调用
MessageClass的message()方法获取字段值时 - 调用
set_message()方法设置字段值时
- 在
对比验证
改用常规C++类而非Proto定义MessageClass,执行相同的旧库替换操作,程序可正常运行,因此推测问题与动态Proto库的内存分配机制相关。
最小复现代码
void Class1::Run() { std::shared_ptr<ProtoMessage> message_shared_ptr = std::make_shared<ProtoMessage>(); ProtoMessage* message_ptr = message_shared_ptr.get(); std::string message = ""; // 若此处改为message = message_ptr->message(),google_protobuf分配内存时触发malloc错误 std::string version = "Ve"; std::string addition = "Class1Object" + version; // 若version设为"Version1",addition过长分配内存时触发错误 message += addition; message_ptr->set_message(message); // 若上述无错误,此设置字段时会触发malloc错误 // ... }
内容的提问来源于stack exchange,提问作者GabrielDracula
相关产品推荐
相关产品推荐

