产品基于cocos2dx开发的棋牌游戏。
出现的问题:如果app游戏时正好网络处于开启状态,则运行正常。反之,则在android logcat输出signal11(SIGSEGV) at 0x00000000(code=1)
12-06 14:59:22.482: I/dalvikvm(8782): dvmDdmHandleHpsgChunk(when 0, what 0, heap 0)
12-06 14:59:23.376: I/dalvikvm(8782): Debugger is active
12-06 14:59:44.266: D/Cocos2dxActivity(8782): model=HUAWEI U9510E
12-06 14:59:44.266: D/Cocos2dxActivity(8782): product=U9510E
12-06 14:59:44.266: D/Cocos2dxActivity(8782): isEmulator=false
12-06 14:59:45.873: W/System.err(8782): /data/system/carrierinfo.prop: open failed: ENOENT (No such file or directory)
12-06 14:59:45.879: W/System.err(8782): java.net.UnknownHostException: Unable to resolve host "feedback.umeng.com": No address associated with hostname
12-06 14:59:45.886: W/System.err(8782): at java.net.InetAddress.lookupHostByName(InetAddress.java:426)
12-06 14:59:45.889: W/System.err(8782): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
12-06 14:59:45.893: W/System.err(8782): at java.net.InetAddress.getAllByName(InetAddress.java:220)
12-06 14:59:45.899: W/System.err(8782): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
12-06 14:59:45.903: W/System.err(8782): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
12-06 14:59:45.903: W/System.err(8782): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
12-06 14:59:45.913: W/System.err(8782): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
12-06 14:59:45.916: W/System.err(8782): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
12-06 14:59:45.923: W/System.err(8782): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
12-06 14:59:45.929: W/System.err(8782): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
12-06 14:59:45.939: W/System.err(8782): at com.umeng.fb.a.b.a(FbClient.java:189)
12-06 14:59:45.943: W/System.err(8782): at com.umeng.fb.model.Conversation$1.run(Conversation.java:219)/data/system/carrierinfo.prop: open failed: ENOENT (No such file or directory)
12-06 14:59:45.946: W/System.err(8782): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-06 14:59:45.946: W/System.err(8782): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-06 14:59:45.946: W/System.err(8782): at java.lang.Thread.run(Thread.java:856)
12-06 14:59:45.949: W/System.err(8782): Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
12-06 14:59:45.966: W/System.err(8782): at libcore.io.Posix.getaddrinfo(Native Method)
12-06 14:59:45.966: W/System.err(8782): at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:56)
12-06 14:59:45.969: W/System.err(8782): at java.net.InetAddress.lookupHostByName(InetAddress.java:411)
12-06 14:59:45.969: W/System.err(8782): ... 14 more
12-06 14:59:45.976: W/System.err(8782): /data/system/carrierinfo.prop: open failed: ENOENT (No such file or directory)
12-06 14:59:47.446: A/libc(8782): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)
完整的排错过程如下
1, android debug模式查看具体出错的问题
貌似不是在android层, 确定为cpp代码出了问题;
2. appdelegate.cpp
CCLog("test")
没有打印出来,仍然直接报错
3. 继续log输出
System.loadLibrary("game");
Log.i(TAG,"android loadLibary done");
logcat能够输出相关代码,说明android层的代码都执行了,现在代码运行到了cpp层;
4. 继续跟踪jni/game/main.cpp
Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit
printf("test")
log cat没有显示print信息
这里一直对cocos2dx在android输出存在疑问。后来在application.mk添加了相关的设置仍然看不到log输出。
5. 采用
coco2d:cclog("test")
情况依旧
6. 开始排除jpush第三方推送jar, so库是否存在问题。
删除libs/libsys.so (jpush的so文件)
删除jpushInterface.init(this)
7. 继续在jni/game/main.cpp
使用ccmessagebox();
没有显示弹出窗口提示;
8. 修改application.mk
LOCAL_CFLAGS += -DCOCOS2D_DEBUG=2
没有结果,问题仍然存在
9. libegl loaded /system/lib.egl/libegl_viviante.so,
如果关闭网络,则没有显示加载上述的so文件
10. 打开jpush.setDebug(true);
在无网络情况下,显示sis error
11. 使用ndk-stack来查找崩溃
./adb logcat|ndk-stack -sym /Users/chenxu/work/c++/cocos2d-x-2.1.4/work/doudizhu/proj.android/obj/local/armeabi/
********** Crash dump: **********
Build fingerprint: 'Huawei/U9510E/hwu9510e:4.0.4/HuaweiU9510E/CHNC00B122:user/ota-rel-keys,release-keys'
pid: 27322, tid: 27322 >>> com.nbgame.doudizhu <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
Stack frame #00 pc 003b8158 /data/data/com.nbgame.doudizhu/lib/libgame.so (_ZN12GameProtocal19createServerMessageEi): Routine createServerMessage in /Users/chenxu/work/c++/cocos2d-x-2.1.4/work/doudizhu/proj.android/../../../baisonext/NetWork/GameProtocal.cpp:46
Stack frame #01 pc 003b7dcc /data/data/com.nbgame.doudizhu/lib/libgame.so (_ZN7Network20dispatchNetworkErrorEi): Routine dispatchNetworkError in /Users/chenxu/work/c++/cocos2d-x-2.1.4/work/doudizhu/proj.android/../../../baisonext/NetWork/Network.cpp:319
真正崩溃原因,这次是冤枉了jpush等第三方库,是android工程编写有问题。
原因是android启动后立即监控网络状态,如果网络为断开状态,则通过jni call cpp, 后者调用dispatchNetwork()函数,通过创建一个message丢入队列,界面线程pop消息之后,画出网络错误提示界面提示。
问题在于:这些都是多线程处理的,即android层由独立线程监控网络状态, cocos2dx界面层由独立线程运行,其中后者在收到网络错误时候,需要有关的未初始化实例来创建消息,导致了空指针的错误。 fatal signal 11(SIGSEGV)
最后解决办法:只有确定网络ok, 并且用户成功登陆后,cpp层采取调用原生android层,去监听网络状态。这样可以避免前面网络未建立就立刻通知界面的错误;
ndk-stack是个好东西,对于android异常崩溃能够提供call-stack,有效确定代码的出错位置;
分享到:
相关推荐
在Cocos2dx 2.x版本中播放MP4格式的视频文件是一项常见的需求,尤其是在开发游戏或者多媒体应用时。Cocos2dx是一个基于C++的游戏开发框架,它提供了丰富的功能来帮助开发者创建2D和3D游戏。在这个场景中,我们将深入...
1. **升级Cocos2dx版本**:最理想的解决方案是将Cocos2dx升级到4.0及以上版本。Cocos2dx团队已经在4.0版本中修复了UIWebView的问题,因此,如果你的项目允许,推荐升级到最新稳定版本。这不仅可以解决UIWebView的弃...
《基于Cocos2dx的游戏开发实例解析》 Cocos2dx是一个开源的游戏开发框架,它基于C++,并提供对多种编程语言的支持,包括Lua和JavaScript。本实例以"基于cocos2dx的一个小例子"为主题,展示了如何利用Cocos2dx进行...
基于cocos2dx3.2的ScrollView改良版,paging分页部分是参考网上已有的源代码并进行改良,修复bug, indicator指示器部分是自己研发。 测试环境:mac os x (Windows平台 应该可行,需要你自己添加PagedScrollView到...
1. **Cocos2dx基础知识**:首先,你需要了解Cocos2dx的基础架构,包括它的事件处理机制、渲染系统、动画制作、物理引擎的集成(如Box2D),以及如何使用Tiled Map进行地图编辑。 2. **场景和层的概念**:在Cocos2dx...
《Cocos2dx工具解析:聚焦CocosBuilder》 Cocos2dx是一个广泛使用的开源游戏开发框架,基于C++,支持跨平台的游戏开发,适用于iOS、Android、Windows等多个平台。在Cocos2dx的生态系统中,有一系列强大的辅助工具,...
总的来说,这个资源为学习Cocos2dx游戏开发,特别是服务端和客户端协同工作,提供了宝贵的实践材料。通过对这些代码的分析和学习,开发者可以掌握网络游戏的设计原理,加深对Cocos2dx引擎的理解,以及如何构建一个跨...
1. **Cocos2dx简介** - Cocos2dx是一个开源的、跨平台的游戏开发框架,基于C++,支持2D和3D图形渲染。 - 它提供了一套丰富的API,用于游戏逻辑、动画、物理引擎、音频处理等,大大简化了游戏开发过程。 - 通过JNI...
1. 确保Cocos2dx和Lua环境已正确安装。 2. 按照`README.txt`的指引配置环境变量。 3. 修改`command.sublime-build`文件,设置项目运行命令。 4. 使用SublimeText打开Lua源代码,按下F7运行项目。 通过这样的配置,...
《cocos2dx游戏开发系列之三:源码解析与Android工程构建》 在游戏开发领域,cocos2dx是一个广泛使用的开源游戏引擎,尤其在跨平台开发中扮演着重要角色。本篇将深入探讨cocos2dx游戏开发系列的第三部分——源码...
“cocos2dx单机大富翁游戏源码”是一个基于cocos2dx框架开发的休闲娱乐游戏项目,旨在为开发者提供一个学习和参考的实例,帮助他们理解和掌握cocos2dx引擎在实际游戏开发中的应用。下面,我们将深入探讨cocos2dx框架...
1. **Cocos2dx 3.2框架详解**: - **跨平台性**:cocos2dx 3.2版本支持多种操作系统,开发者只需要编写一次代码,即可实现多平台发布,大大提高了开发效率。 - **性能优化**:3.2版本对渲染引擎进行了优化,提升了...
“cocos2dx 2048”游戏的开发涉及到了cocos2dx框架的多个方面,包括图形渲染、物理引擎、事件处理、资源管理以及游戏逻辑等,对于想要学习游戏开发的程序员来说,这是一个很好的实践项目,可以深入理解cocos2dx框架...
《我所理解的Cocos2dx》是一本深入解析Cocos2d-x游戏引擎的高清扫描版书籍,基于Cocos2d-x3.0版本进行详细讲解。Cocos2dx是一个开源的游戏开发框架,它基于C++,同时支持Lua和JavaScript,让开发者能够快速构建2D和...
本文将详细介绍如何解决Cocos2dx中的中文乱码问题,以及“ToolsThreePart”这个工具可能扮演的角色。 1. **理解编码格式**: - **ASCII**:基础的西文字符集,不包含中文。 - **GBK/GB2312**:中国的国家标准,...
Birkemose的代码是一个很好的起点,但为了适应Cocos2dx v3.13,我们需要对原有的代码进行适配和优化。 在Cocos2dx 3.x中实现水波纹效果,我们主要依赖以下几个核心概念和技术: 1. **纹理(Texture)和精灵...
在本篇内容中,我们将深入探讨“我所理解的cocos2dx pdf”这一主题,通过对标题、描述以及部分关联内容的分析,提取并总结出关于Cocos2dx的重要知识点。 ### Cocos2d-x 概览 #### 1. Cocos2d-x 是什么? Cocos2d-x...
【cocos2dx 超级玛丽 demo 源码】是基于cocos2dx游戏引擎开发的一个经典游戏“超级玛丽”的示例项目。cocos2dx是一个开源的游戏开发框架,它采用C++编写,同时支持iOS、Android等多个平台,为开发者提供了高效且便捷...
Cocos2dx是一款高度受欢迎的游戏开发框架,专为2D和3D游戏设计。它基于C++,并提供了丰富的API接口,使得开发者可以方便地创建跨平台的游戏应用。在提供的标题“cocos2dx-3.0功能强大的richText控件源码”中,我们...
【cocos2dx教程】 ...总的来说,cocos2dx是一个功能强大且灵活的2D游戏开发工具,通过学习和实践,你可以创建出各种有趣且具有吸引力的手机游戏。记得持续关注cocos2dx的更新,以获取最新的特性和性能优化。