非常难缠的signal 11 (SIGSEGV)

现在很多游戏都是动态模拟物理效果的,而事实证明这样的游戏也相当受欢迎。。。。好吧,又是愤怒的小鸟。。。
好吧,Android能实现的,估计也只有Box2D了。。。
最近解决了一个非常恶心难缠的问题,都快被它给逼疯了~见log

10-28 12:39:17.779: I/DEBUG(7749): Build fingerprint: 'google/passion/passion:2.3.6/GRK39F/189904:user/release-keys'
10-28 12:39:17.779: I/DEBUG(7749): pid: 17414, tid: 17446  >>> com.soybea.rocket <<<
10-28 12:39:17.779: I/DEBUG(7749): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
10-28 12:39:17.779: I/DEBUG(7749):  r0 00000027  r1 deadbaad  r2 a0000000  r3 00000000
10-28 12:39:17.779: I/DEBUG(7749):  r4 00000001  r5 00000000  r6 44bc8c10  r7 44984e64
10-28 12:39:17.779: I/DEBUG(7749):  r8 44bc8b70  r9 44984e54  10 44984e3c  fp 800a5368
10-28 12:39:17.779: I/DEBUG(7749):  ip afd46668  sp 44bc8ae0  lr afd191d9  pc afd15ca4  cpsr 60000030
10-28 12:39:17.779: I/DEBUG(7749):  d0  646f423262287964  d1  6f42796f72747365
10-28 12:39:17.779: I/DEBUG(7749):  d2  646e412f65737062  d3  6850656e69676e32
10-28 12:39:17.779: I/DEBUG(7749):  d4  786f427363697379  d5  736e657478454432
10-28 12:39:17.779: I/DEBUG(7749):  d6  2f696e6a2f6e6f69  d7  79442f4432786f42
10-28 12:39:17.779: I/DEBUG(7749):  d8  42ce94f34e6e6b28  d9  3c8888893c888888
10-28 12:39:17.779: I/DEBUG(7749):  d10 c26f7c303f800000  d11 3fed9bafc26f7e0e
10-28 12:39:17.779: I/DEBUG(7749):  d12 0000000000000000  d13 0000000000000000
10-28 12:39:17.779: I/DEBUG(7749):  d14 0000000000000000  d15 0000000000000000
10-28 12:39:17.779: I/DEBUG(7749):  d16 3ef18d523ae9735c  d17 3fca68bfcfa2d635
10-28 12:39:17.779: I/DEBUG(7749):  d18 bf29fd09783e4216  d19 3ec6cd878c3b46a7
10-28 12:39:17.779: I/DEBUG(7749):  d20 3f826164f3f641b5  d21 3f5e8ec8e86d933e
10-28 12:39:17.779: I/DEBUG(7749):  d22 3e3782e7e0000000  d23 3e33401660000000
10-28 12:39:17.779: I/DEBUG(7749):  d24 3fca99a880000000  d25 bfca99a880000000
10-28 12:39:17.779: I/DEBUG(7749):  d26 be3ff77520000000  d27 3ef99342e0ee5069
10-28 12:39:17.779: I/DEBUG(7749):  d28 bfa2b4442c6a6c2f  d29 0000000000000000
10-28 12:39:17.779: I/DEBUG(7749):  d30 0000000000000000  d31 0000000000000000
10-28 12:39:17.779: I/DEBUG(7749):  scr 80000012
10-28 12:39:17.829: I/DEBUG(7749):          #00  pc 00015ca4  /system/lib/libc.so
10-28 12:39:17.829: I/DEBUG(7749):          #01  pc 0001c92c  /system/lib/libc.so
10-28 12:39:17.829: I/DEBUG(7749):          #02  pc 00026504  /data/data/com.soybea.rocket/lib/libandenginephysicsbox2dextension.so
10-28 12:39:17.829: I/DEBUG(7749):          #03  pc 00013e18  /data/data/com.soybea.rocket/lib/libandenginephysicsbox2dextension.so
10-28 12:39:17.829: I/DEBUG(7749):          #04  pc 00017e34  /system/lib/libdvm.so
10-28 12:39:17.829: I/DEBUG(7749): code around pc:
10-28 12:39:17.829: I/DEBUG(7749): afd15c84 2c006824 e028d1fb b13368db c064f8df
10-28 12:39:17.829: I/DEBUG(7749): afd15c94 44fc2401 4000f8cc 49124798 25002027
10-28 12:39:17.829: I/DEBUG(7749): afd15ca4 f7f57008 2106ec7c edd8f7f6 460aa901
10-28 12:39:17.829: I/DEBUG(7749): afd15cb4 f04f2006 95015380 95029303 e93ef7f6
10-28 12:39:17.829: I/DEBUG(7749): afd15cc4 462aa905 f7f62002 f7f5e94a 2106ec68
10-28 12:39:17.829: I/DEBUG(7749): code around lr:
10-28 12:39:17.829: I/DEBUG(7749): afd191b8 4a0e4b0d e92d447b 589c41f0 26004680
10-28 12:39:17.829: I/DEBUG(7749): afd191c8 686768a5 f9b5e006 b113300c 47c04628
10-28 12:39:17.829: I/DEBUG(7749): afd191d8 35544306 37fff117 6824d5f5 d1ef2c00
10-28 12:39:17.829: I/DEBUG(7749): afd191e8 e8bd4630 bf0081f0 00028344 ffffff88
10-28 12:39:17.829: I/DEBUG(7749): afd191f8 b086b570 f602fb01 9004460c a804a901
10-28 12:39:17.829: I/DEBUG(7749): stack:
10-28 12:39:17.829: I/DEBUG(7749):     44bc8aa0  afd42664  
10-28 12:39:17.829: I/DEBUG(7749):     44bc8aa4  000a7d18  
10-28 12:39:17.829: I/DEBUG(7749):     44bc8aa8  00000015  
10-28 12:39:17.829: I/DEBUG(7749):     44bc8aac  afd182a1  /system/lib/libc.so
10-28 12:39:17.829: I/DEBUG(7749):     44bc8ab0  afd4270c  
10-28 12:39:17.829: I/DEBUG(7749):     44bc8ab4  afd426b8  
10-28 12:39:17.829: I/DEBUG(7749):     44bc8ab8  00000000  
10-28 12:39:17.829: I/DEBUG(7749):     44bc8abc  afd191d9  /system/lib/libc.so
10-28 12:39:17.829: I/DEBUG(7749):     44bc8ac0  00000001  
10-28 12:39:17.829: I/DEBUG(7749):     44bc8ac4  44bc8af4  
10-28 12:39:17.829: I/DEBUG(7749):     44bc8ac8  44bc8c10  
10-28 12:39:17.829: I/DEBUG(7749):     44bc8acc  44984e64  
10-28 12:39:17.829: I/DEBUG(7749):     44bc8ad0  44bc8b70  
10-28 12:39:17.829: I/DEBUG(7749):     44bc8ad4  afd184fb  /system/lib/libc.so
10-28 12:39:17.839: I/DEBUG(7749):     44bc8ad8  df002777  
10-28 12:39:17.839: I/DEBUG(7749):     44bc8adc  e3a070ad  
10-28 12:39:17.839: I/DEBUG(7749): #00 44bc8ae0  44984e54  
10-28 12:39:17.839: I/DEBUG(7749):     44bc8ae4  44984e3c  
10-28 12:39:17.839: I/DEBUG(7749):     44bc8ae8  800a5368  
10-28 12:39:17.839: I/DEBUG(7749):     44bc8aec  afd18821  /system/lib/libc.so
10-28 12:39:17.839: I/DEBUG(7749):     44bc8af0  afd426b8  
10-28 12:39:17.839: I/DEBUG(7749):     44bc8af4  fffffbdf  
10-28 12:39:17.839: I/DEBUG(7749):     44bc8af8  afd1c92d  /system/lib/libc.so
10-28 12:39:17.839: I/DEBUG(7749):     44bc8afc  afd3ade9  /system/lib/libc.so
10-28 12:39:17.839: I/DEBUG(7749):     44bc8b00  80540c00  /data/data/com.soybea.rocket/lib/libandenginephysicsbox2dextension.so
10-28 12:39:17.839: I/DEBUG(7749):     44bc8b04  afd1c931  /system/lib/libc.so
10-28 12:39:17.839: I/DEBUG(7749): #01 44bc8b08  0000006c  
10-28 12:39:17.839: I/DEBUG(7749):     44bc8b0c  80540f08  /data/data/com.soybea.rocket/lib/libandenginephysicsbox2dextension.so
10-28 12:39:17.839: I/DEBUG(7749):     44bc8b10  80540f08  /data/data/com.soybea.rocket/lib/libandenginephysicsbox2dextension.so
10-28 12:39:17.839: I/DEBUG(7749):     44bc8b14  44bc8b90  
10-28 12:39:17.839: I/DEBUG(7749):     44bc8b18  00000000  
10-28 12:39:17.839: I/DEBUG(7749):     44bc8b1c  80526508  /data/data/com.soybea.rocket/lib/libandenginephysicsbox2dextension.so
10-28 12:39:18.839: I/DEBUG(7749): debuggerd committing suicide to free the zombie!
10-28 12:39:18.839: I/BootReceiver(96): Copying /data/tombstones/tombstone_03 to DropBox (SYSTEM_TOMBSTONE)
10-28 12:39:18.879: I/DEBUG(17474): debuggerd: Sep 20 2011 11:21:24

 

 

 

首先,你得承认经常看到这样的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. 还没遇到。。。。

深层次原因
同样经过无数次的试验和失败,几次挑灯夜战,越过重重GFW,翻阅无数资料,发现这类问题,基本都是深层代码的NullPointerReference所导致的

Bug解释
Box2D里有一个arraylist来维护当前所有的body,是在某个线程(可能是当前工作线程)运行的for循环,如果你在某个线程对body做了一些操作(如destory body)就会导致问题出现。。。

如何避免
1. 不要频繁大规模的创建/删除body对象,尽可能复用可以复用的对象,暂时不用的应当设置为不可见,使body sleep
2. 管理好你的线程,永远使用一个相同的线程来创建/管理/修改body对象
3. ContactListener中不要放实际方法,尽量异步调用
4. 设计模式很重要。。。

 

 

解决实例
下面是我的解决实例,仅供参考


Java代码  
1.protected static Queue<Object> deleteQueue=new LinkedList<Object>();   
2.IUpdateHandler deleteUpdateHandler=new IUpdateHandler() {   
3.    @Override  
4.    public void onUpdate(float pSecondsElapsed) {   
5.        if (!deleteQueue.isEmpty()) {   
6.            //Do the delete body work   
7.        }   
8.    }   
9.}   
10.Scene.registerUpdateHandler(deleteUpdateHandler);  
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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "interrupted by signal 11: sigsegv" 是指程序在运行时发生了 "Segmentation Fault (SIGSEGV)" 错误,导致程序被终止。这通常是由于程序试图访问不属于其领域的内存地址导致的。 ### 回答2: 在计算机编程中,interrupted by signal 11: sigsegv是一种经常出现的错误。这个错误代码出现的原因是程序访问了一个不属于它的内存地址,导致系统无法找到需要的内存位置造成程序崩溃。 出现这种错误的原因很多,比如指针错误,数组越界等。当程序存在这些问题时,执行的操作会超出内存的范围,而意外地读取了一些没有被分配的地址,进而导致系统发生了错误,最终打印出“interrupted by signal 11: sigsegv”的错误信息。 为了避免这种错误,我们应该养成好的编程习惯,遵守编程语言的规则,严格地检查变量的合法性和正确性。在程序出现问题时,尽快利用调试工具定位问题所在,找出错误的源头,排除不合法的代码。 备份程序是另一个好习惯,确保我们可以及时恢复代码,对于程序遭遇崩溃,我们可以利用备份文件快速恢复程序,以免造成不必要的损失。 总之,遵循正确的编程规范,养成好的编程习惯,以及备份程序代码,都可以有效避免interrupted by signal 11: sigsegv这种错误。 ### 回答3: “interrupted by signal 11: sigsegv”这个错误是指在程序执行时,出现了一种叫做“段错误”的问题,即程序访问了一个未被授权的内存地址,导致程序崩溃。 在操作系统中,每个进程都有自己的虚拟内存空间,当程序需要访问内存时,会通过虚拟地址来访问对应的物理内存地址。如果程序访问了一个超出自身虚拟内存空间的地址,或者访问了系统保护的内存区域,就会引发“段错误”,导致程序崩溃。 通常情况下,“interrupted by signal 11: sigsegv”这个错误会包含一段内存地址信息,根据这个地址可以找到错误的位置。可以先检查代码,看是否有指针或数组越界的情况,或者是否使用了已经释放的内存空间。还可以使用调试工具,如gdb,对程序进行调试,查找问题所在。 对于这个错误,最好的解决办法是及时进行错误排查和修复,确保程序不会在未授权的内存地址上进行访问,以避免类似的崩溃问题再次出现。同时,在进行程序开发时,也应该注意代码的健壮性和安全性,避免出现类似的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值