从解决Cocos2dx-2.x arm64 Crash 来看C的奇技淫巧
最近把以前做的老游戏拿出来,重新编到手机上来玩玩,然后就有了以下的经历。
那时的引擎还是Cocos2dx-2.x,iPhone5还是高档机型。现在的机器是这样的,iPhone6S Plus我自用,今年iPhone7S都要出来了,真是时光荏苒,岁月如梭。
拿出我的CooolPad大神F2,OK。iPhone6S Plus,OK。Ad-Hoc,安装OK,运行,崩了。最令开发人员抓狂的事情出现了,Debug版OK,Release版崩溃。
这里还是要感谢一下Xcode,Release版也是可以调试的这个事情。最近逛论坛,有位童鞋把Debug版没问题Release版崩溃的应用不断的提到AppStore,被退回来的几乎崩溃,然后有位跟帖的好心人告诉他,把Scheme里的Run改成Release就可以调试了。
崩溃点在这里
~CURLRaii() {
if (m_curl)
curl_easy_cleanup(m_curl);//崩溃在这里
/* free the linked list for header data */
if (m_headers)
curl_slist_free_all(m_headers);
}
的确,不用curl_easy_cleanup(m_curl)就不崩溃了,但显然这不是个好办法。
然后就是各种搜索,有个人给出了下面的方法
bool perform(int *responseCode) {
if (CURLE_OK != curl_easy_perform(m_curl))
return false;
long temp = ;//注意这里,用long类型去获得curl_easy_getinfo的信息
CURLcode code = curl_easy_getinfo(m_curl, CURLINFO_RESPONSE_CODE, &temp);
*responseCode = (int)temp;
if (code != CURLE_OK || *responseCode != )
return false;
// Get some mor data.
return true;
}
问题解决,显然这是C语言的老问题了,传指针的时候一定要类型匹配。以前没问题是因为32位平台上long和int是一样的,包括我现在的酷派大神。其实如果是原来的工程也应该是没问题的,因为那时的Cocos2dx中的curl是32位的静态库,但是现在AppStore要求必须要提供64位的版本,所以这个问题是无法掩盖了。现在的问题就是,这个崩溃的锅,应该由谁来背?
表面来看,这个锅是Cocos2dx的,君不见curl的接口描述是这样的,谁让你传int进去的?
/*
* NAME curl_easy_getinfo()
*
* DESCRIPTION
*
* Request internal information from the curl session with this function. The
* third argument MUST be a pointer to a long, a pointer to a char * or a
* pointer to a double (as the documentation describes elsewhere). The data
* pointed to will be filled in accordingly and can be relied upon only if the
* function returns CURLE_OK. This function is intended to get used *AFTER* a
* performed transfer, all results from this function are undefined until the
* transfer is completed.
*/
CURL_EXTERN CURLcode
curl_easy_getinfo(CURL * curl , CURLINFO info, ... ) ;
但请不要忘记,这是C语言,强类型的语言,出现这种因为类型不匹配引起的崩溃,责任可不全在调用者身上,我连个警告都没看到,谁知道你是怎么运作的?下面我们来看一下这个没有警告的“泛型”是怎么运作的。
首先,curl强调了这个函数有并且只有3个参数
/* This preprocessor magic that replaces a call with the exact same call is
only done to make sure application authors pass exactly three arguments
to these functions. */
#define curl_easy_setopt(handle, opt, param) curl_easy_setopt(handle,opt,param)
#define curl_easy_getinfo(handle, info, arg) curl_easy_getinfo(handle,info,arg)
#define curl_share_setopt(share, opt, param) curl_share_setopt(share,opt,param)
#define curl_multi_setopt(handle, opt, param) curl_multi_setopt(handle,opt,param)
然后利用变长参数不检查类型的特点完成了这个戏法,本质上这和scanf是一样的,当初栽在这个函数上的童鞋们这回应该明白崩溃的原因了吧。
我很少用C语言的原因就是C的基础设施很少,C的奇技淫巧很多。虽然C++的坑更多,但是在不踩雷的情况下,还是能基本完成任务的。在C的领域内,你要是不会点此类的技巧,你几乎什么也做不了。
这也说明了,片面的强调编程语言应该是强类型还是弱类型都是不对的,C语言千方百计的要泛型,现在的脚本语言却逐渐开始强调类型声明。
最后,这个问题在C++中是可以避免的,也不用着上面的“技巧”。当然,我声明成long*或者long&,你非得传int就不能怨我了。
从解决Cocos2dx-2.x arm64 Crash 来看C的奇技淫巧的更多相关文章
- 解决cocos2dx在Xcode中运行时报:convert: iCCP: known incorrect sRGB profile 的问题
解决cocos2dx在Xcode中运行时报:convert: iCCP: known incorrect sRGB profile 的问题 本文的实践来源是参照了两个帖子完成的: http://dis ...
- linux下开发,解决cocos2d-x中编译出现的一个小问题, undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
解决cocos2d-x中编译出现的一个小问题 对于cocos2d-x 2.×中编译中,若头文件里引入了#include "cocos-ext.h",在进行C++编译的时候会遇到例如 ...
- 解决cocos2d-X 2.0版本后创建的Android项目提示org.cocos2dx.lib.Cocos2dxActivity找不到问题
原地址: http://blog.163.com/zhoulong19880518@126/blog/static/6070970220132511558143/ 解决方法: 复制 ***\co ...
- 【Cocos2d-x游戏开发】解决Cocos2d-x中文乱码的三种方法
众所周知,Cocos2d-x是一款不错的开源引擎,但是在Cocos2d-x中直接使用中文是无法正确显示的.比如下面的情况: 解决这个问题常用的有三种方法:1.通过转换为UTF-8编码来显示.2.使用i ...
- 解决cocos2dx调用removeFromParent后报错问题
原因:cocos2dx的bug 解决办法: 放到action中,前面添加一个DelayTime延迟,代码如下 this->runAction(Sequence::create(DelayTime ...
- [Windows] 解决 VLC Media Player 的 Crash Reporting 消息弹窗
运行环境:Windows 8.1 (64bits), VLC Media Player 2.1.3 异常描述:首次启动VLC播放影音文件时,一切正常.此后每次启动VLC都弹出"VLC Cra ...
- Mac OS X 10.9下解决cocos2d-x在Xcode4.6.x的模板不显示问题
最近将iMac 升级到10.9了,奇怪的事情发生了,cocos2d-x的模板不见了,鼓捣了半天发现问题所在 打开xcode新建工程却找不到cocos2d-x的模板. 经过在网上的苦苦搜寻和试验后,找到 ...
- 解决 Cocos2d-x 3.2 error C1041: 无法打开程序数据库vc120.pdb
单个项目解决方案 解决方案是为项目添加 /FS (Force Synchronous PDB Writes) 编译选项,具体位置在: 一劳永逸的解决方案 直接修改cocos的项目模板templates ...
- 解决 Cocos2d-x 中 Android.mk 手动添加源文件
转自:http://blog.csdn.net/ypfsoul/article/details/8909178 Makefile Android.mk 引发的思索 在我们编写 Android 平台 c ...
随机推荐
- 主效应|处理误差 |组间误差|处理效应|随机误差|组内误差|误差|效应分析|方差齐性检验|SSE|SSA|SST|MSE|MSA|F检验|关系系数|完全随机化设计|区组设计|析因分析
8 什么是只考虑主效应的方差分析? 就是不考虑交互效应的方差分析,即认为因素之间是不相互影响的,就是无重复的方差分析. 什么是处理误差 (treatment error).组间误差(between ...
- HGNC
国际人类基因组组织(The Human Genome Organisation,简称HUGO)是一个参与绘制人类基因组图谱的人类基因组计划的国际非政府组织.人类基因组组织作为一国际组织成立于1989年 ...
- python学习笔记(23)-异常处理
#异常处理与调试 #异常:在运行代码过程中遇到的任何错误,带有error字样的都是异常 #异常处理,对代码中所有可能出现的异常进行的处理 #1.处理某个错误 2,处理某个类型的错误 3 有错就抓 一. ...
- 【ubuntu】乱七八糟
https://blog.csdn.net/totorocyx/article/details/80032556 https://blog.csdn.net/weixin_40662331/artic ...
- Xen入门系列三【Xen 管理工具 xm】
xm命令是管理Xen的最基本的工具,可以通过xm --help 来获得帮助. 1. 列出所有正在运行的虚拟操作系统 # xm list PS[1]:可缩写为 xm li 2. 启动虚拟机 # 通过配置 ...
- blast -m1
当database是10个物种(A.B.C.E.F.G.H.J.I.K)时,进行all vs all 比对结果是: 此时reference是物种A的第一个基因:即用10个物种的genome中的所有基因 ...
- WWT在中国:一个改变了人类探索宇宙方式的少年梦想
想象一下,在宇宙中超光速飞行,访问行星.星云.恒星和小行星将是多么美妙的体验.现在,中国的孩子们已经可以坐在屋子里,仰望穹顶,去探索星球之间无穷的奥秘. 在微软研究院.微软亚洲研究院及中国科学院国家天 ...
- 深入探讨Java中的异常与错误处理
Java中的异常处理机制已经比较成熟,我们的Java程序到处充满了异常的可能,如果对这些异常不做预先的处理,那么将来程序崩溃就无从调试,很难找到异常所在的位置.本文将探讨一下Java中异常与错误的处理 ...
- ContentType明细对照表(文件类型相关的设置)
文件扩展名 Content-Type(Mime-Type) 文件扩展名 Content-Type(Mime-Type) .*( 二进制流,不知道下载文件类型) application/octet-st ...
- <JZOJ1329>旅行
贪心大水题 #include<cstdio> #include<iostream> #include<cstring> #include<algorithm& ...