背景

项目中使用protobuf作为网络传输协议,最开始在项目中直接使用源代码编译,在真机上测试一直是正常的,直到某天开始在 CPU是64 bit的设备上发现protobuf导致crash了,于是就开始尝试使用.a静态库看看是否能解决问题(失败了)。bug解决方案直接看最后。

开发环境

  • OS X 10.9 Mavericks
  • Xcode 5.0.2
  • protobuf 2.5.0
  • IOS7

Crash现象

protobuf在静态初始化的时候,crash在一个delete[] XXXptr; 这个指针是一个NULL。非常奇怪在32bit的ios设备上同样也是执行到这里也是delete[] nullptr就没有问题。简单搜索了一下,没有什么收获,遂暂时放弃直接解决这个问题。

  1. template <typename TypeHandler>
  2. void RepeatedPtrFieldBase::Destroy() {
  3. for (int i = 0; i < allocated_size_; i++) {
  4. TypeHandler::Delete(cast<TypeHandler>(elements_[i]));
  5. }
  6. delete [] elements_;  // elements_ == NULL
  7. }

尝试编译.a

略过大堆因为Xcode升级而无效/需修改的方法,直接上目前找到最靠谱的一个全自动脚本:https://gist.github.com/BennettSmith/7150245

这个脚本实现了:

  • 下载protobuf 2.5.0源代码
  • 生产5个平台的静态库(mac 64, iPhone simulator, armv7, armv7s, arm 64)
  • 合并成一个完整的Universal静态库。

编译是成功的,可能对于大部分人来说,到这里就结束了。

但是。。。在将生成的.a加入工程中依然出现了std库找不到的link错误。

静态库编辑成功

调整了除mac64平台外的CXX编译参数,和项目中使用的参数匹配之后,终于成功了。

最终使用的参数如下,(mac64的保持不变)

    • CXX=clang++
    • CXXFLAGS_ARM="${CFLAGS} -stdlib=libstdc++"
    • LDFLAGS_ARM="-stdlib=libstdc++"

但是。。。在64bit设备上依然Crash,现象同上。可以宣布这个尝试方向失败了!

问题解决

很意外的发现,crash的地方是Libproto.dylib,这个库是Apple自带的,而项目中是没有使用到这个库的。Google了一 下:“ImageLoader on the newer devices (iPhone 5S and apparently iPad air) has its own copy of Protocol Buffers which causes symbol collisions.",也就是说在最新的3个设备上有个库自带了一个Protobuf,和项目中的protobuf的namespace是一样的,这 样就就产生了冲突。
办法就很简单了:
  1. 使用protobuf源代码(正好这项目原来就使用源代码)
  2. 修改google\protobuf\stubs\common.h,加入一行宏定义,修改本地的命名空间
  1. namespace std {}
  2. #define google google_private
  3. namespace google {
  4. namespace protobuf {

相关信息

Xcode 5.0.2的一些默认参数

  • C Language Dialect:GUN99(-std=gnu99)
  • C++ Language Dialect:GNU++98(-std=gnu++98)
  • C++ Standard Library:libstdc++(-stdlib=libstdc++)

StackOverflow上的回答:http://stackoverflow.com/questions/19848118/weird-ios-libprotobuf-dylib-cause-crash

【转】protobuf2.5.0在<delete [] elements_;>crash的问题。的更多相关文章

  1. [转]protobuf-2.5.0.tar.gz的下载与安装

    protobuf-2.5.0.tar.gz的下载与安装 原文地址:http://blog.csdn.net/tdmyl/article/details/31811317 版权声明:本文为博主原创文章, ...

  2. 编译protobuf-2.5.0中的错误处理

    最近在编译protobuf-2.5.0源码的时候发现的错误已经应对方法 1. 在源码目录执行 ./configure 命令的时候,发生如下错误 error: C++ preprocessor &quo ...

  3. protobuf-2.5.0.tar.gz的下载与安装

    1.下载 hadoop使用protocol buffer进行通信,须要下载和安装protobuf-2.5.0.tar.gz.因为如今protobuf-2.5.0.tar.gz已经无法在官网https: ...

  4. protobuf-2.5.0的下载与安装

    1.下载 Hadoop使用protocol buffer进行通信,需要下载和安装protobuf-2.5.0.tar.gz.由于现在protobuf-2.5.0.tar.gz已经无法在官网https: ...

  5. linux编译安装protobuf2.5.0

    1.下载安装包 https://github.com/google/protobuf/releases?after=v3.0.0-alpha-4.1 找到相应的版本下载 2.解压安装包 #.tar.g ...

  6. 深入解读MySQL8.0 新特性 :Crash Safe DDL

    前言 在MySQL8.0之前的版本中,由于架构的原因,mysql在server层使用统一的frm文件来存储表元数据信息,这个信息能够被不同的存储引擎识别.而实际上innodb本身也存储有元数据信息.这 ...

  7. 低于0.01%的极致Crash率是怎么做到的?

    WeTest 导读 看似系统Bug的Crash 99%都不是系统问题!本文将与你一起探索Crash分析的科学方法. 在移动互联网闯荡多年的iOS手机管家,经过不断迭代创新,已经涵盖了隐私(加密相册). ...

  8. Hadoop3.2.0使用详解

    1.概述 Hadoop3已经发布很久了,迭代集成的一些新特性也是很有用的.截止本篇博客书写为止,Hadoop发布了3.2.0.接下来,笔者就为大家分享一下在使用Hadoop3中遇到到一些问题,以及解决 ...

  9. 2690036 - SAP HANA 2.0 SPS 03 Database Revision 034

    Symptom This is the SAP Release Note for SAP HANA 2.0 Database Revision 034 (2.00.034.00) of the SAP ...

随机推荐

  1. 九度OJ - 题目1481:Is It A Tree?

    题目描述: A tree is a well-known data structure that is either empty (null, void, nothing) or is a set o ...

  2. ASP.NET MVC的约定

    ASP.NET MVC 应用程序遵循以下3条约定: 所有的控制器的名称都以Controller结尾,如HomeController, AccountController 这些类默认在Controlle ...

  3. jsf2入门视频 教程

    jsf2.0 入门视频 教程   需要的看下.初次录视频.还有很多需要完善. JSF交流QQ群84376982 JSF入门视频下载地址  http://pan.baidu.com/s/1jG3y4T4 ...

  4. android项目在eclipse下编译运行的问题

    JDK与电脑系统要匹配,都是32位或者64位: android工程要与JDK相匹配,如果之前的android工程使用的jdk版本较高,则可能出现一些包或者类.方法.属性对应不上而报错,Android ...

  5. php实现调用微信上传照片然后保存至服务器与数据库

    <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>    <s ...

  6. 1509 -- Glass Beads POJ

    题意:求一个字符串的最小表示的开始下标 就当模板题写了 把字符串重复一遍,再建后缀自动机,贪心的选最小字典序在上面走len步 因为走出来的一定是子串,长度又是len,所以一定是原来的字符串旋转得到的, ...

  7. Scroll文字滚动js

    function ScrollImgLeft(){ var speed=50, doc=document, scroll_begin = doc.getElementById("scroll ...

  8. Linux下使用GDB调试程序

    问题描述:          Linux下使用GDB调试程序 问题解决:          (1)生成调试文件 注:         使用命令   gdb IOStream.c   -o IOStre ...

  9. Log4net Level

    ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); l ...

  10. XSS 攻击在它的面前都弱爆了!

    虽然双十一刚刚过去不久,但是对很多工程师来说,连续熬夜加班的「噩梦」似乎还没有过去.尤其是像双十一这种活动,对于电商网站的工程师们来说,他们需要彻夜的加班加点来保障网站的稳定性和安全性.当然,面对上千 ...