Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)问题解决

来源:互联网 发布:windows系统评级 编辑:程序博客网 时间:2024/04/30 07:19

异常出现频率:非必现,乍看不可捉摸。

BUG导致:应用程序崩溃,过一小会儿会自动退出。

Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)



遇到这个问题很无奈,但是经过不断探索终于找到了问题的原因!!!

这个问题非常不给面子,居然在给上级演示程序的时候突然崩坏! 哭哭哭!!!NND看老子一会儿怎么治你!!!


这个是典型的多线程引起的问题,

我当时的应用场景是:

SurfaceView里面有一个Bitmap成员变量

而我们都知道SurfaceView里面的绘图方法是在一个新开的线程里面执行的,在这个绘图方法里,会执行把Bitmap绘制到Canvas上面的操作

当我点击一个按钮的时候,可能会改变Bitmap的引用,指向另外一张处理完成的图片,这个时候Bitmap这个成员变量会被我recycle(),释放掉。

问题就在这里了,我在recycle这个Bitmap的时候,也许Thread中正在执行把Bitmap绘制到Canvas上的操作,可能刚好正在执行当中,或者执行了一半,而GC毫不留情地把这个Bitmap请上了天堂,就这样,Java调用底层的API当中就突然发生了Error,因此这个问题才没有任何的Java异常提示。


解决问题的办法就是:

1. 在SurfaceView的按钮点击事件里用到Bitmap的地方改写代码:

[plain] view plaincopy
  1. Bitmap bmp = null;  
  2.   
  3. synchronized(mBmp)  
  4. {  
  5.     bmp = mBmp;  
  6.     mBmp = filter(bmp);  
  7. }  
  8.           
  9. // 释放  
  10. if(bmp.isRecycled() == false)  
  11. {  
  12.     bmp.recycle();  
  13.     bmp = null;  
  14.     System.gc();  
  15. }  


2. 在SurfaceView的Thread当中改写代码:

[plain] view plaincopy
  1. synchronized(mBmp)  
  2. {  
  3.     // ...  
  4.     canvas.drawBitmap(mBmp, mMatrix, null);  
  5. }  

OK!烦恼不再!啤酒一杯~

原文:http://blog.csdn.net/sonikk/article/details/9217181

0 0
原创粉丝点击