关于异常 libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x64616570 in tid 17260 (FinalizerDaemon)

来源:互联网 发布:windows 访问samba 编辑:程序博客网 时间:2024/06/13 18:15

         从学习android 入门到现在,遇到问题,第一反应都是网上查资料,看看前辈们是怎么处理的,在融合自己的项目,加以更改,但不是每一个问题网上都是有分享的,到最后还是靠自己,最近入手的项目上 遇到的 libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x64616570 in tid 17260 (FinalizerDaemon)这个错误,作为开发应用层的我  瞬间就蒙了,很肯定 是内存操作出问题的 ,网上资料找了好多,但都不是问题所在,没办法自己 摸索找吧,周末一人复查代码,最终找到了问题所在,在此记录下。

该项目是关于音视频和语音对讲的,三者在各自的线程中,有自己的 start(),stop()方法,直接调用即可,很简单,但当反复start()和stop(),就会随机性的出现 libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x64616570 in tid 17260 (FinalizerDaemon)  这个错误, 导致程序崩溃, 最后在 反复排除后 发现是音频的start()里 造成的,  把音频注释掉,再怎么start  和stop  都没任何问题,   上音频 代码:


public class AudioThread extends Thread {                         private final int AUDIO_BUF_SIZE = 160;   private final int FRAME_INFO_SIZE = 16;   @Override   public void run() {      System.out.printf("[%s] Start\n", Thread.currentThread().getName());      AVAPIs av = new AVAPIs();      byte[] frameInfo = new byte[FRAME_INFO_SIZE];      byte[] audioBuffer = new byte[AUDIO_BUF_SIZE];      int[] frameNumber = new int[1];      byte[] pcm = new byte[320];      audioCodec mAudioCodec = new audioCodec();      Log.d(TAG, "run:  new audioCodec();");      int size = AudioTrack.getMinBufferSize(8000,            AudioFormat.CHANNEL_OUT_MONO,            AudioFormat.ENCODING_PCM_16BIT);       mAudioTrack = new AudioTrack(AudioManager.MODE_IN_COMMUNICATION , // 指定在流的类型            8000, AudioFormat.CHANNEL_OUT_MONO,// 设置输出声道为双声道立体声            AudioFormat.ENCODING_PCM_16BIT,// 设置音频数据块是8位还是16位            size , AudioTrack.MODE_STREAM);      DoorBell.travk_map.put(avcodec.this.uid,mAudioTrack);      mAudioTrack.setStereoVolume(1.0f, 1.0f);// 设置当前音量大      mAudioTrack.play();      int ret;      Log.i(TAG, "audio avindex:" + avindex.get() + " sid: " + sid.get());      while (isAudioRecv.get()) {         ret = av.avCheckAudioBuf(avcodec.this.avindex.get());         if (ret < 0) {            System.out.printf("[%s] avCheckAudioBuf() failed: %d\n",                  Thread.currentThread().getName(), ret);            try {               Thread.sleep(200);            } catch (InterruptedException e) {               e.printStackTrace();            }            continue;         } else if (ret < 3) {            try {               Thread.sleep(200);               continue;            } catch (InterruptedException e) {               System.out.println(e.getMessage());               continue;            }         }         ret = av.avRecvAudioData(avcodec.this.avindex.get(),               audioBuffer, AUDIO_BUF_SIZE, frameInfo,               FRAME_INFO_SIZE, frameNumber);         if (ret > 0) {            mAudioCodec.audioCodec_decodec(audioBuffer, pcm);            mAudioTrack.write(pcm,0,320);               if (!AcousticEchoCanceler.isAvailable() && isAudioSend.get()) {               if (mEchoWebrtc != null){                  mEchoWebrtc.echoWebrtcEchoPlay(pcm);               }            }         } else if (ret == AVAPIs.AV_ER_SESSION_CLOSE_BY_REMOTE) {            System.out.printf("[%s] AV_ER_SESSION_CLOSE_BY_REMOTE\n",                  Thread.currentThread().getName());            break;         } else if (ret == AVAPIs.AV_ER_REMOTE_TIMEOUT_DISCONNECT) {            System.out.printf("[%s] AV_ER_REMOTE_TIMEOUT_DISCONNECT   AudioThread  \n",                  Thread.currentThread().getName());            break;         } else if (ret == AVAPIs.AV_ER_INVALID_SID) {            System.out.printf("[%s] Session cant be used anymore\n",                  Thread.currentThread().getName());            break;         } else if (ret == AVAPIs.AV_ER_LOSED_THIS_FRAME) {            continue;         }      }   /* try {         mAudioCodec.finalize();      } catch (Throwable e) {         e.printStackTrace();      }*/   if (mAudioTrack != null){      try{         mAudioTrack.stop();         mAudioTrack.release();         mAudioTrack = null;      }catch ( IllegalStateException e){         e.printStackTrace();      }   }   }}
 当我stop()时   会退出while 循环 ,接着 执行的就是
try {         mAudioCodec.finalize();      } catch (Throwable e) {         e.printStackTrace();      }

finalize()
也正是 调用这句话 导致 随机性的 崩溃。

对于 finnalize 只限于粗略懂,没深入理解过,也是下午看前辈的博客,
http://blog.csdn.net/shanghui815/article/details/6787855
才多少领会到用法,


1 0