signal 11(SIGSEGV) fault addr deadbaad错误处理
2016-02-20 15:03
696 查看
原文地址:signal
11(SIGSEGV) fault addr deadbaad错误处理 作者:landuochong
首先,你得承认经常看到这样的log是要崩溃的。。。。
没有任何debug信息,你不知道是哪句出错了,你只知道,深层的so调用出问题了。。。
而你基本不可能再去修改这些文件去适应你的程序,因为
1. 能力不足
2. 即使实力超群,投入产出比也相当的不经济,有这些精力解决自己的程序才是正道~
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad,在使用box2d extension的时候你有可能会经常遇到这样的问题,尤其是当你的应用比较大,比较复杂的时候~
在下才疏学浅,只好用最土的办法,隔行打log。。。。
经过无数次的研究尝试,总结出如下规律~
它通常发生在
1. 创建Body
2. 移动Body
3. 删除Body
4. ContactListener
5. 手动设置Body对象为null
6. 还没遇到。。。。
深层次原因
同样经过无数次的试验和失败,几次挑灯夜战,越过重重**,翻阅无数资料,发现这类问题,基本都是深层代码的NullPointerReference所导致的
Bug解释
Box2D里有一个arraylist来维护当前所有的body,是在某个线程(可能是当前工作线程)运行的for循环,如果你在某个线程对body做了一些操作(如destory body)就会导致问题出现。。。
如何避免
1. 不要频繁大规模的创建/删除body对象,尽可能复用可以复用的对象,暂时不用的应当设置为不可见,使body sleep
2. 管理好你的线程,永远使用一个相同的线程来创建/管理/修改body对象
3. ContactListener中不要放实际方法,尽量异步调用
4. 设计模式很重要。。。
解决实例
下面是我的解决实例,仅供参考
最后,永远不要指望什么灵丹妙药,这些解决方法也不是狗皮膏药,贴了就好,小心的设计你的模式,认真调试代码,否则这个问题会像牛皮癣一样难以彻底根除
2.错误可以用arm-eabi-addr2line工具找到signal错误时的代码行,但需要出错时的pc指针值,
============Log info=============
01-01 23:59:09.196: I/DEBUG(91): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
01-01 23:59:09.196: I/DEBUG(91): r0 00000000 r1 00f92310 r2 00000000 r3 00000000
01-01 23:59:09.196: I/DEBUG(91): r4 deadd00d r5 40aadc78 r6 0000020c r7 5287794c
01-01 23:59:09.196: I/DEBUG(91): r8 4bf7b940 r9 4bf7be50 10 0106c080 fp 01132bc0
01-01 23:59:09.196: I/DEBUG(91): ip 00000000 sp 528776e0 lr 40a45f8f pc 40a45f8e cpsr 60000030
01-01 23:59:09.326: I/DEBUG(91): #00 pc 00050f8e /system/lib/libdvm.so (dvmAbort)
01-01 23:59:09.326: I/DEBUG(91): #01 pc 00055bd4 /system/lib/libdvm.so (_Z20dvmDecodeIndirectRefP6ThreadP8_jobject)
01-01 23:59:09.327: I/DEBUG(91): #02 pc 000589f8 /system/lib/libdvm.so
01-01 23:59:09.329: I/DEBUG(91): #03 pc 0004b44a /system/lib/libchromium_net.so
01-01 23:59:09.330: I/DEBUG(91): #04 pc 0004b4aa /system/lib/libchromium_net.so
============Log info==============
===========Command=============
./prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-addr2line -C -f -e ./out/target/product/a2_3g_data/symbols/system/lib/liblewebcore.so 0x0004b44a
================================
BFD: Dwarf Error: mangled line number section.
WebCore::MediaPlayerPrivate::setVisible(bool)
diy-fp.cc:0
关注我的技术公众号,查看更多优质技术文章推送
微信扫一扫下方二维码即可关注:
11(SIGSEGV) fault addr deadbaad错误处理 作者:landuochong
首先,你得承认经常看到这样的log是要崩溃的。。。。
没有任何debug信息,你不知道是哪句出错了,你只知道,深层的so调用出问题了。。。
而你基本不可能再去修改这些文件去适应你的程序,因为
1. 能力不足
2. 即使实力超群,投入产出比也相当的不经济,有这些精力解决自己的程序才是正道~
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad,在使用box2d extension的时候你有可能会经常遇到这样的问题,尤其是当你的应用比较大,比较复杂的时候~
在下才疏学浅,只好用最土的办法,隔行打log。。。。
经过无数次的研究尝试,总结出如下规律~
它通常发生在
1. 创建Body
2. 移动Body
3. 删除Body
4. ContactListener
5. 手动设置Body对象为null
6. 还没遇到。。。。
深层次原因
同样经过无数次的试验和失败,几次挑灯夜战,越过重重**,翻阅无数资料,发现这类问题,基本都是深层代码的NullPointerReference所导致的
Bug解释
Box2D里有一个arraylist来维护当前所有的body,是在某个线程(可能是当前工作线程)运行的for循环,如果你在某个线程对body做了一些操作(如destory body)就会导致问题出现。。。
如何避免
1. 不要频繁大规模的创建/删除body对象,尽可能复用可以复用的对象,暂时不用的应当设置为不可见,使body sleep
2. 管理好你的线程,永远使用一个相同的线程来创建/管理/修改body对象
3. ContactListener中不要放实际方法,尽量异步调用
4. 设计模式很重要。。。
解决实例
下面是我的解决实例,仅供参考
protected static Queue<Object> deleteQueue=new LinkedList<Object>(); IUpdateHandler deleteUpdateHandler=new IUpdateHandler() { @Override public void onUpdate(float pSecondsElapsed) { if (!deleteQueue.isEmpty()) { //Do the delete body work } } } Scene.registerUpdateHandler(deleteUpdateHandler);同样,你也可以创建多个队列,分别管理你的创建/删除/碰撞检测等操作~
最后,永远不要指望什么灵丹妙药,这些解决方法也不是狗皮膏药,贴了就好,小心的设计你的模式,认真调试代码,否则这个问题会像牛皮癣一样难以彻底根除
2.错误可以用arm-eabi-addr2line工具找到signal错误时的代码行,但需要出错时的pc指针值,
============Log info=============
01-01 23:59:09.196: I/DEBUG(91): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
01-01 23:59:09.196: I/DEBUG(91): r0 00000000 r1 00f92310 r2 00000000 r3 00000000
01-01 23:59:09.196: I/DEBUG(91): r4 deadd00d r5 40aadc78 r6 0000020c r7 5287794c
01-01 23:59:09.196: I/DEBUG(91): r8 4bf7b940 r9 4bf7be50 10 0106c080 fp 01132bc0
01-01 23:59:09.196: I/DEBUG(91): ip 00000000 sp 528776e0 lr 40a45f8f pc 40a45f8e cpsr 60000030
01-01 23:59:09.326: I/DEBUG(91): #00 pc 00050f8e /system/lib/libdvm.so (dvmAbort)
01-01 23:59:09.326: I/DEBUG(91): #01 pc 00055bd4 /system/lib/libdvm.so (_Z20dvmDecodeIndirectRefP6ThreadP8_jobject)
01-01 23:59:09.327: I/DEBUG(91): #02 pc 000589f8 /system/lib/libdvm.so
01-01 23:59:09.329: I/DEBUG(91): #03 pc 0004b44a /system/lib/libchromium_net.so
01-01 23:59:09.330: I/DEBUG(91): #04 pc 0004b4aa /system/lib/libchromium_net.so
============Log info==============
===========Command=============
./prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-addr2line -C -f -e ./out/target/product/a2_3g_data/symbols/system/lib/liblewebcore.so 0x0004b44a
================================
BFD: Dwarf Error: mangled line number section.
WebCore::MediaPlayerPrivate::setVisible(bool)
diy-fp.cc:0
关注我的技术公众号,查看更多优质技术文章推送
微信扫一扫下方二维码即可关注:
相关文章推荐
- 网络字节转换inet_aton & inet_ntoa & inet_addr和inet_pton & inet_ntop
- Linux ip 命令
- linux单网卡多IP
- nginx前端根据$remote_addr分发方法 推荐
- OSPF转发地址(forwarding address)深入解析
- 解决Linux中ifconfig和addr查看不到ip问题
- 从零开始搭建android App 日志(3)
- 7个CSS单位
- 创建安卓app的30个经验教训
- 面向对象思想的提升
- 《大学之路》读后感(1)
- Android 社交娱乐聊天APP
- hdu 3585 最快代码
- 检索问题“Where to Buy It: Matching Street Clothing Photos in Online Shops”
- Xcode常用快捷键 (转载)
- Android Studio - Gradle项目 - NDK开发 - JNI编译中引用本地so - 记录
- xib/纯代码/storyboard之争
- 请大神看看10.10Beta1的AppleRTC怎么破?原版会导致BIOS重置!
- 怎么解决xp系统不能安装NET Framework4.0?
- java ThreadPoolExecutor 关键代码分析