【转】protobuf2.5.0在<delete [] elements_;>crash的问题。

背景

项目中使用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就没有问题。简单搜索了一下,没有什么收获,遂暂时放弃直接解决这个问题。

[cpp] view plaincopy

  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,加入一行宏定义,修改本地的命名空间

[cpp] view plaincopy

  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

时间: 2024-11-10 16:35:49

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

protobuf-2.5.0安装

解压缩protobuf-2.5.0     tar -zxvf  protobuf-2.5.0.tar.gz cd protobuf-2.5.0     ./configure --prefix=/usr/local/protoc/  (这个目录可以随便自己建立,编译后的文件位于/usr/local/protoc/目录下)     make     make install 只要不出错就可以了. (其中我出过一次这个错误libtool: install: error: cannot instal

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

前言在MySQL8.0之前的版本中,由于架构的原因,mysql在server层使用统一的frm文件来存储表元数据信息,这个信息能够被不同的存储引擎识别.而实际上innodb本身也存储有元数据信息.这给ddl带来了一定的挑战,因为这种架构无法做到ddl的原子化,我们在线上经常能够看到数据目录下遗留的临时文件,或者类似server层和innodb层列个数不一致之类的错误.甚至某些ddl可能还遗留元数据在innodb内,而丢失了frm,导致无法重建表-..(我们为了解决这个问题,实现了一个叫drop

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

WeTest 导读 看似系统Bug的Crash 99%都不是系统问题!本文将与你一起探索Crash分析的科学方法. 在移动互联网闯荡多年的iOS手机管家,经过不断迭代创新,已经涵盖了隐私(加密相册).安全(骚扰拦截.短信过滤).工具(网络检测.照片清理.极简提醒等)等等各个方面,为千万用户提供安全专业的服务.但与此同时,工程代码也越来越庞大(近30万行),一丁点的问题都会影响大量的用户,所以手管一直在质量上下狠功夫,对Crash率更是追求极致.近几个迭代对Crash做了专项分析,Crash率在原

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 HANA platform software Support Package Stack (SPS 03). Please refer to the following SAP Notes: SAP Note 2380229 - SAP HANA Platform 2.0 - Central No

宏定义中使用do{}while(0)的好处 (转载)

宏定义中使用do{}while(0)的好处   #define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因: 1,空的宏定义避免warning: #define foo() do{}while(0) 2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现. 3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现: #define foo(x) /action1(); /action2(); 在以下情况

Hadoop 2.2.0 常见问题之:Ubuntu 64环境下“Unable to load native-hadoop library for your platform”问题”

问题 最近在学习Hadoop(2.2.0),打算写一个MapReduce的小程序在Ubuntu 64位的环境下测试一把,一切环境配置完毕后,执行的过程中,控制台输出下面的内容: WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 原因 在网上搜索了一番,得出如下结论: "The reason

SHELL脚本提取binlog delete语句 供恢复数据

binlog日志 如下:/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;/*!40019 SET @@session.max_insert_delayed_threads=0*/;/*!50003 SET @[email protected]@COMPLETION_TYPE,COMPLETION_TYPE=0*/;DELIMITER /*!*/;# at 120#160111 16:37:29 server id 333336  end_log_pos

ProtocolBuffer 2.5.0 编译安装

rotobuf-2.5.0.tar.gz的下载与安装 1.下载 hadoop使用protocol buffer进行通信,需要下载和安装protobuf-2.5.0.tar.gz.由于现在protobuf-2.5.0.tar.gz已经无法在官网https://code.google.com/p/protobuf/downloads/list中下载了,本人将protobuf-2.5.0.tar.gz上传到百度云盘供大家下载,地址: http://pan.baidu.com/s/1pJlZubT .

Spark-1.4.0单机部署(Hadoop-2.6.0采用伪分布式)【已测】

??目前手上只有一个机器,就先拿来练下手(事先服务器上没有安装软件)尝试一下Spark的单机部署. ??几个参数: ??JDK-1.7+ ??Hadoop-2.6.0(伪分布式): ??Scala-2.10.5: ??Spark-1.4.0: ??下面是具体的配置过程 安装JDK 1.7+ [下载网址]http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 环境变量设置(最好不要采用o