程序的主要功能
进程的主要功能是定期轮训获取设备上所添加的下级设备的信息.最近突然发现在某些情况下会发生WEB获取到的下级设备信息一直不正确的问题.不过此问题也是偶尔发生的,也加上自己的盲目自信一直以为没啥问题就一直没关注此问题.今天测试找到了此问题的稳定复现条件,就详细记录下解决此bug的过程.
处理流程
bug复现后,使用strace去跟踪发现只要出现WEB获取下级设备信息不正确的情况下总是会出现问题:
也就是出现的死锁问题导致的WEB在获取下级设备的时候一直不能获取到正确的设备信息.
经过最终的定位,发现此问题是由于之前所创建一个用于记录获取下级设备信息失败的次数的全局数组越界导致的.大致的代码如下:
int g_supportChNum=32;
int g_chNum=64;
char *g_subDevInfoGetFailTime=NULL;
g_subDevInfoGetFailTime = (char *)malloc(sizeof(g_subDevInfoGetFailTime) *g_supportChNum);
.....
int i=0;
for(i=0;i<g_chNum;i++){
if(0 != com_getSubDevInfo(i))
g_subDevInfoGetFailTime[i]=1;//i=62的时候获取失败
}
由于之前的失误将g_subDevInfoGetFailTime分配为长度为32的数组了.但是此设备是一个支持64通道的设备.而出现下级设备获取失败的通道是在61通道.
这就出现了明明只分配了32字节的空间的g_subDevInfoGetFailTime,在出现获取失败的情况下却在操作g_subDevInfoGetFailTime[61]即第62个字节,就导致了内存越界的问题.进而出现了线程死锁.