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

         从学习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();
      }

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

 

 

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值