繁体   English   中英

Protobuf object 在传递到动态库时被破坏

[英]Protobuf object gets corrupted when passed to a dynamic library

我正在将我的库与一些深度学习框架集成,我遇到了一些 memory 问题。 我怀疑 protobuf 是这里的问题,但我想征求你们的意见和一些帮助,因为我已经花了太多时间在这上面。 简而言之,该框架在 ONNX 格式的深度学习模型上运行。 它将它们读入 memory 到onnx::ModelProto对象。 然后将这些对象传递给我的库,在那里它们被转换(和优化)为我的自定义表示并返回到框架。 onnx::ModelProto是一个 C++ protoc使用来自https://github.com/onprotobuf/onnx.protox-amaster/

ModelProto到达我的库时,就会出现问题。 ModelProto的主要成员是图,它是一个指针: onnx::GraphProto* onnx::ModelProto::graph_ 当 object 被传递到我的库时,图形指针被设置为一些不同的地址,这不是正确的GraphProto object 位置:

framework:
model_proto: 0x2ccb450
graph address: 0x2cc1d20
---
mylib:
model_proto: 0x2ccb450
graph address: 0x7fb6529c2560

烦人的事情是它只发生在发布版本中。 当我在调试中编译两者时 - 它可以正常工作。

此外,在弹出此错误之前,我使用std::stringstreamModelProto object 传递到我的库 - 我首先将框架中的 model 序列化为字符串,在 myD5498196C8 的 myD5498196C8 中创建了一个 ZF7B44CFAFD5C5222223E 库。 反序列化完成后,图表也被破坏了,这太糟糕了,以至于我的代码中进一步出现了段错误。

这与框架和我的库都与它们自己的 protobuf 副本静态链接这一事实有关吗? Protobuf 作为依赖项添加,并与框架和我的库一起编译。 我确保我使用相同的版本(目前是 3.11)。 我也使用相同的 ONNX 版本(1.6)。

以下是依赖项和工作流程的外观:

依赖关系

由于 C++ 中没有标准 ABI,因此在单独构建的库之间传递对象的门槛相当高。

使用 protobuf 的全部原因是将对象转换为字符串,然后在两个端点之间交换这些字符 arrays。 这样您就可以解决 object 周围的所有问题,这些问题具有不同的布局、格式、精度和字节序。

如果您绝对想传递指针,则构建设置必须相同。 一切。 所有编译器和 linker 版本、设置、所有#defines、优化级别等......这是一条很难遵循的路径,并且是一个脆弱的解决方案。

我想我已经找到了解决方案,但我仍然不能 100% 确定根本原因是什么。

ONNX 库允许您自定义生成的类将驻留的命名空间https://github.com/onnx/onnx/blob/master/CMakeLists.txt#L76-L78

我在我的库中将它设置为任意值,最终解决了这个问题。 我已经切换回 istringstream 版本,它似乎工作。 它已经通过了许多 CI 检查,所以到目前为止情况看起来不错。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM