【转】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就没有问题。简单搜索了一下,没有什么收获,遂暂时放弃直接解决这个问题。
- template <typename TypeHandler>
- void RepeatedPtrFieldBase::Destroy() {
- for (int i = 0; i < allocated_size_; i++) {
- TypeHandler::Delete(cast<TypeHandler>(elements_[i]));
- }
- delete [] elements_; // elements_ == NULL
- }
尝试编译.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是一样的,这 样就就产生了冲突。办法就很简单了:
- 使用protobuf源代码(正好这项目原来就使用源代码)
- 修改google\protobuf\stubs\common.h,加入一行宏定义,修改本地的命名空间
- namespace std {}
- #define google google_private
- namespace google {
- 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的问题。的更多相关文章
- [转]protobuf-2.5.0.tar.gz的下载与安装
protobuf-2.5.0.tar.gz的下载与安装 原文地址:http://blog.csdn.net/tdmyl/article/details/31811317 版权声明:本文为博主原创文章, ...
- 编译protobuf-2.5.0中的错误处理
最近在编译protobuf-2.5.0源码的时候发现的错误已经应对方法 1. 在源码目录执行 ./configure 命令的时候,发生如下错误 error: C++ preprocessor &quo ...
- protobuf-2.5.0.tar.gz的下载与安装
1.下载 hadoop使用protocol buffer进行通信,须要下载和安装protobuf-2.5.0.tar.gz.因为如今protobuf-2.5.0.tar.gz已经无法在官网https: ...
- protobuf-2.5.0的下载与安装
1.下载 Hadoop使用protocol buffer进行通信,需要下载和安装protobuf-2.5.0.tar.gz.由于现在protobuf-2.5.0.tar.gz已经无法在官网https: ...
- linux编译安装protobuf2.5.0
1.下载安装包 https://github.com/google/protobuf/releases?after=v3.0.0-alpha-4.1 找到相应的版本下载 2.解压安装包 #.tar.g ...
- 深入解读MySQL8.0 新特性 :Crash Safe DDL
前言 在MySQL8.0之前的版本中,由于架构的原因,mysql在server层使用统一的frm文件来存储表元数据信息,这个信息能够被不同的存储引擎识别.而实际上innodb本身也存储有元数据信息.这 ...
- 低于0.01%的极致Crash率是怎么做到的?
WeTest 导读 看似系统Bug的Crash 99%都不是系统问题!本文将与你一起探索Crash分析的科学方法. 在移动互联网闯荡多年的iOS手机管家,经过不断迭代创新,已经涵盖了隐私(加密相册). ...
- Hadoop3.2.0使用详解
1.概述 Hadoop3已经发布很久了,迭代集成的一些新特性也是很有用的.截止本篇博客书写为止,Hadoop发布了3.2.0.接下来,笔者就为大家分享一下在使用Hadoop3中遇到到一些问题,以及解决 ...
- 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 ...
随机推荐
- poj 2774 Long Long Message 后缀数组LCP理解
题目链接 题意:给两个长度不超过1e5的字符串,问两个字符串的连续公共子串最大长度为多少? 思路:两个字符串连接之后直接后缀数组+LCP,在height中找出max同时满足一左一右即可: #inclu ...
- php + mysql + sphinx 的全文检索(2)
简单 使用php api 去查询 sphinx 的索引数据 $sphinx = new SphinxClient(); $sphinx->SetServer ( ...
- Sybase ASE安装过程报错,无法创建数据库设备[AM fork() failed]
今天同事要搭建一套测试环境,安装开发版的SYBASE ASE 15.03 Windows平台下的,发现安装过程中到了创建数据库设备的环节就开始报错了,报错信息如下: 03/24/14 09:31:44 ...
- ExtJS 添加图标icon
extjs控件有两个属性:一个是iconCls:另一个是icon.通过这两个属性可以对控件添加图标 1.直接引用图标路径 icon: '../icons/application_view_detail ...
- EXTJS4.2 控件之Grid 根据数据源某列数据不同绑定不同的控件setEditor
Grid 根据数据源某列数据不同绑定不同的控件,例如:文本框和下拉框 主要代码写在grid的 plugins: [rowEditing],下面这是定义的rowEditing对象,这里面的要定义成 E ...
- oracle 求两个时间点直接的分钟、小时数
select )) h, )) m, )) s from gat_data_record gdr where gdr.enddt between to_date('2011-1-1','yyyy-mm ...
- hibernate hql 大全
Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承.多态 和关联之类的概念. ...
- uva 437 hdu 1069
dp 将石块按三个面存入队列 按底面积排序 dp就最大高度 按嵌套矩形最长路做做法 #include <iostream> #include <cstdio> #inc ...
- define中的:#,##,#@
[define中的:#,##,#@] #define Conn(x,y) x##y #define ToChar(x) #@x #define ToString(x) #x (2)x##y表示什么?表 ...
- hdu 4336 Card Collector 容斥原理
读完题目就知道要使用容斥原理做! 下面用的是二进制实现的容斥原理,详见:http://www.cnblogs.com/xin-hua/p/3213050.html 代码如下: #include< ...