您的位置:首页 > 其它

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

2016-07-31 18:53 489 查看
         从学习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

才多少领会到用法,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐