客户xx公司,TTS报警项目,项目需求是在营业厅中放置一个报警设备,需要报警的时候,自动打电话并且在对端播报TTS报警。
在4个月之内,隔一段时间就会出现报警返回ERROR的问题。上周刚接到问题,以为是概率问题,并且抓不到log(log是使用printf打印,都打印到了atfwd_daemon进程中),上位机也得不到log,因此解决起来比较困难,一开始几天没重视,后来发现客户需要赶紧解决,不然要退货,这才看是看TTS代码。
1、根据客户描述,这应该是linux应用问题,和底层无关
2、客户现场失败后,使用 AT+GTTS? 查询到播放标记为1
3、涉及场景是通话和播放TTS
4、从现象看,大概率是软件问题,并且在我们公司应该可以复现
根据上面分析,我们开始走读代码。我们的代码涉及到如下:
apps_proc/mdm-ss-mgr/atfwd-daemon
主要涉及
atfwd_misc.c、pcm_util.c、tts.c
因为是TTS返回ERROR,所以我们首先走读下TTS代码
TTS播放命令
at+gtts=1,“E5B9BFE5928CE9809AE697A0E7BABFE882A1E4BBBDE69C89E99990E585ACE58FB8”,0
tts_handle_tts_cmd是播放TTS的入口函数,但是如果当前正在播放TTS,也就说说,播放的标记为1,这个时候就会返回ERROR。
if(tts_get_play_status())
break;
else
tts_handle_tts_cmd();
这里我们就怀疑,客户这里会不会就是这样问题。
但是为什么此时不再播放,但是播放标记为1呢?,继续走读代码
void tts_handle_tts_cmd(void)
{
...
tts_broadcast_status = TRUE;
...
pthread_attr_init(&thrd_attr);
pthread_attr_setdetachstate(&thrd_attr, PTHREAD_CREATE_DETACHED);
pthread_create(&process_tts_thread, &thrd_attr, tts_play_thread, CurTtsCmd);
}
这个函数中会把播放标记tts_broadcast_status 设置为true,然后去做了个分离线程,在线程里面去编码,打开通路,aplay去播放,最后把tts_broadcast_status标记设置为false。
在代码中全局搜索了变量 tts_broadcast_status ,也只有这个地方设置为true,别的地方不会设置,这里就***怀疑是不是没有进入线程?***
根据怀疑修改代码,打印出了线程创建的返回值开机进行压测。
测试部压测的结果出来了,如下:
第一天:
2021-10-26 01:25:11,822-INFO - 语音呼叫 601 次,成功 533 次,成功率 88.69%
2021-10-26 01:25:11,822-INFO - TTS播放 5215 次,成功 5214 次,成功率 99.98%
第二天:
2021-10-27 01:59:12,837-INFO - 语音呼叫 617 次,成功 562 次,成功率 91.09%
2021-10-27 01:59:12,837-INFO - TTS播放 4309 次,成功 4308 次,成功率 99.98%
分析log后,发现前俩天的压测都是通话成功500多次后,后续的通话播放TTS都是失败的。
并且,打印出来pthread_create返回11,根据错误码,发现是内存不足,无法创建线程,
那我们就怀疑,应该是哪里有内存泄漏的问题。排查TTS代码,暂没有发现可疑的地方。
换个思路去想,因为我们是通话中去播放TTS的,那会不会是通话的代码泄漏了,导致影响TTS,根据这个,我们查看voice代码,果然发现有个问题。
代码如下:
在后台 atfwd_daemon进程跑起来的时候,会创建一个voice线程,但是线程没有回收,也没有做分离线程,那这个线程资源就泄漏了。如果设备一直不重启,并且多次播放挂断电话,进程没有没有资源,达到了创建线程的最大数,TTS线程就创建不出来,就会导致问题,会不会是这样的呢?
带着分析的疑问,我们尝试修改代码
static void* voice_thread_func (void *user_choice)
{
...
pthread_detach(pthread_self());
...
}
在线程里面做了分离线程,这样系统会自动回收。
修改后进行压测,结果如下:
2021-10-28 08:45:59,533-INFO - 语音呼叫 1282 次,成功 1194 次,成功率 93.14%
2021-10-28 08:45:59,533-INFO - TTS播放 7258 次,成功 7258 次,成功率 100.00%
挂测一晚上,依然可以通话,并且TTS播放一直成功。
问题得到解决