概述
从学习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] Startn", 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: %dn",
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_REMOTEn",
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 anymoren",
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();
}
也正是 调用这句话 导致 随机性的 崩溃。
最后
以上就是长情毛巾为你收集整理的关于异常 libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x64616570 in tid 17260 (FinalizerDaemon)的全部内容,希望文章能够帮你解决关于异常 libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x64616570 in tid 17260 (FinalizerDaemon)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复