高通MDM9607平台--线程资源泄漏问题定位

高通MDM9607平台--线程资源泄漏问题定位

      • 1、问题描述
      • 2、问题分析
      • 3、问题定位
      • 4、问题解决

1、问题描述

客户xx公司,TTS报警项目,项目需求是在营业厅中放置一个报警设备,需要报警的时候,自动打电话并且在对端播报TTS报警。

在4个月之内,隔一段时间就会出现报警返回ERROR的问题。上周刚接到问题,以为是概率问题,并且抓不到log(log是使用printf打印,都打印到了atfwd_daemon进程中),上位机也得不到log,因此解决起来比较困难,一开始几天没重视,后来发现客户需要赶紧解决,不然要退货,这才看是看TTS代码。

2、问题分析

1、根据客户描述,这应该是linux应用问题,和底层无关
2、客户现场失败后,使用 AT+GTTS? 查询到播放标记为1
3、涉及场景是通话播放TTS
4、从现象看,大概率是软件问题,并且在我们公司应该可以复现

3、问题定位

根据上面分析,我们开始走读代码。我们的代码涉及到如下:

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%

高通MDM9607平台--线程资源泄漏问题定位_第1张图片

分析log后,发现前俩天的压测都是通话成功500多次后,后续的通话播放TTS都是失败的。
并且,打印出来pthread_create返回11,根据错误码,发现是内存不足,无法创建线程,

那我们就怀疑,应该是哪里有内存泄漏的问题。排查TTS代码,暂没有发现可疑的地方。

换个思路去想,因为我们是通话中去播放TTS的,那会不会是通话的代码泄漏了,导致影响TTS,根据这个,我们查看voice代码,果然发现有个问题。
代码如下:
高通MDM9607平台--线程资源泄漏问题定位_第2张图片
在后台 atfwd_daemon进程跑起来的时候,会创建一个voice线程,但是线程没有回收,也没有做分离线程,那这个线程资源就泄漏了。如果设备一直不重启,并且多次播放挂断电话,进程没有没有资源,达到了创建线程的最大数,TTS线程就创建不出来,就会导致问题,会不会是这样的呢?

4、问题解决

带着分析的疑问,我们尝试修改代码

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播放一直成功。

问题得到解决

你可能感兴趣的:(驱动,mdm9607,高通,资源泄漏,TTS)