奇怪的ios libprotobuf.dylib导致崩溃

时间:2013-11-07 22:35:12

标签: ios protocol-buffers dylib

我在项目中编译了我自己的protobuf(在主目标中,而不是lib),但我发现了一个崩溃,这是由libprotobuf.dylib中的protobuf代码引起的(在我的猜测中是一个新包含的lib在新的设备版本 - 我的是ipad air。。

* thread #1: tid = 0x6598, 0x0027e96e TutorChat`void google::protobuf::internal::RepeatedPtrFieldBase::Destroy<google::protobuf::RepeatedPtrField<google::protobuf::UninterpretedOption>::TypeHandler>(this=0x1567158c) + 66 at repeated_field.h:814, queue = 'com.apple.main-thread, stop reason = breakpoint 2.41
    frame #0: 0x0027e96e TutorChat`void google::protobuf::internal::RepeatedPtrFieldBase::Destroy<google::protobuf::RepeatedPtrField<google::protobuf::UninterpretedOption>::TypeHandler>(this=0x1567158c) + 66 at repeated_field.h:814
    frame #1: 0x37f231f2 libprotobuf.dylib`google::protobuf::FileOptions::~FileOptions() + 38
    frame #2: 0x37f231be libprotobuf.dylib`google::protobuf::FileOptions::~FileOptions() + 10
    frame #3: 0x37f18764 libprotobuf.dylib`google::protobuf::FileDescriptorProto::~FileDescriptorProto() + 56
    frame #4: 0x37f11296 libprotobuf.dylib`google::protobuf::EncodedDescriptorDatabase::Add(void const*, int) + 206
    frame #5: 0x37ef13d0 libprotobuf.dylib`google::protobuf::DescriptorPool::InternalAddGeneratedFile(void const*, int) + 76
    frame #6: 0x37f1696a libprotobuf.dylib`google::protobuf::protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto() + 146
    frame #7: 0x37f2a580 libprotobuf.dylib`_GLOBAL__I_a + 8
    frame #8: 0x2be0e5a0 dyld`ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) + 176
    frame #9: 0x2be0e6b0 dyld`ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) + 20
    frame #10: 0x2be0bd36 dyld`ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) + 358
    frame #11: 0x2be0bcb8 dyld`ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) + 232
    frame #12: 0x2be0bb8c dyld`ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) + 40
    frame #13: 0x2be05276 dyld`dyld::runInitializers(ImageLoader*) + 78
    frame #14: 0x2be092c2 dyld`dlopen + 1030
    frame #15: 0x381d978c libdyld.dylib`dlopen + 48
    frame #16: 0x2f863794 libGFXShared.dylib`gfxInitializeLibrary + 1056
    frame #17: 0x2f7940fc GLEngine`gliInitializeLibrary + 44
    frame #18: 0x2f856b60 OpenGLES`eagl_init + 436
    frame #19: 0x2f856792 OpenGLES`-[EAGLSharegroup initWithAPI:sharedWithCompute:] + 114
    frame #20: 0x2f855b7e OpenGLES`-[EAGLContext initWithAPI:properties:] + 242
    frame #21: 0x0179870e libglInterpose.dylib`EAGLContext_initWithAPIProperties(EAGLContext*, objc_selector*, unsigned int, NSDictionary*) + 74
    frame #22: 0x2f8559de OpenGLES`-[EAGLContext initWithAPI:sharedWithCompute:] + 142

我想内部lib ImageLoader会根据需要加载protobuf,这会覆盖我自己的符号。所以我想知道有没有办法让事情做对?

3 个答案:

答案 0 :(得分:3)

是的,较新设备上的ImageLoader(iPhone 5S,显然是iPad air)有自己的协议缓冲区副本,会导致符号冲突。

我通过编辑我的google / protobuf / stubs / common.h并在文件顶部附近插入以下行来解决这个问题:

#define google myapp

现在,我的Google protobuf实现副本使用命名空间“myapp”而不是“google”,因此这些符号不会与系统符号冲突。

答案 1 :(得分:1)

我遇到了同样的问题。从lincolnq排队我修改了我的protobuf构建脚本,在我的构建中将:: google命名空间重命名为:: google_public。这解决了protobuf的Apple私有版本的问题。

我发布了一个脚本,可以创建一个可以工作的protobuf构建。你可以看看这里:

https://gist.github.com/BennettSmith/7150245

该脚本将为适用于所有体系结构的库生成一个胖二进制文件。它还构建了protoc编译器,因此您可以将其作为自定义构建步骤运行,以编译.proto文件。

干杯

- 贝内特

答案 2 :(得分:0)

我今天遇到了这个问题。我将使用默认设置的符号设置为YES(以及内联对应项)进行构建。经过nm -g的广泛检查后,这隐藏了Apple似乎正在调用的导出的Google protobuf符号(这些符号与您获得的符号不同,但仍然在同一个地方;图像加载)。

在Apple批准我们之后,我会更新此答案,并确认其有效。