关于异常 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
- 关于异常 libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x64616570 in tid 17260 (FinalizerDaemon)
- signal 11 (SIGSEGV),code 1,fault addr 0x0 和 Fatal signal 6 (SIGABRT), code -6 in tid 7061
- Fatal signal 11 (SIGSEGV), code 2, fault addr 0x9ff811c0 in tid 28902
- 科大讯飞语音 --- Signal 11(SIGSEGV),code 1(SEGV_MAPERR)fault addr 0xcb74000
- A/libc﹕ Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 25427 (pool-1-thread-2)
- 解决F/libc ( 953): Fatal signal 11 (SIGSEGV) at 0x00000003 (code=1), thread 1720 问题
- Android Studio异常:Fatal signal 11 (SIGSEGV) at 0x000000b4 (code=1)
- Fatal signal 11 (SIGSEGV) at 0x390955ae (code=1)
- Fatal signal 11 (SIGSEGV) at 0x000007c4 (code=1)
- Fatal signal 11 (SIGSEGV) at 0x390955ae (code=1)
- Fatal signal 11 (SIGSEGV) at 0x00000048 (code=1)
- Fatal signal 11 (SIGSEGV) at 0x00000004 (code=1)
- Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)
- Fatal signal 11 (SIGSEGV) at 0xccf0001d (code=1)
- signal 11(SIGSEGV) fault addr deadbaad错误处理
- 关于“Fatal signal 11 (SIGSEGV) at 0x00000004 (code=1), thread 7592 (xample.hellojni)”android NDK错误排查
- Fatal signal 11 (SIGSEGV) code 1 (SEGV_MAPERR)的解决方案
- JNI中Fatal signal 11 (SIGSEGV), code 1的错误.
- 算法等基本概念
- java之用beanUtils框架来操作bean
- 【笔记】Java Mail发送邮件(使用QQ邮箱)
- 杭电ACM 盐水的故事
- UGUI 学习02
- 关于异常 libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x64616570 in tid 17260 (FinalizerDaemon)
- ACM457
- 今天在ubuntu上装chromium,因无法加载flashplayer,我卸载了,卸载之后重新安装,就启动不了
- mytest
- tjut 4300
- Session入库的作用
- HDU 1316 How Many Fibs?(递推,大数相加)
- static 关键字的用法
- Codeforces Round #269 (Div. 2) D kmp