最近测评人员在对项目软件进行测评时发现了两个死机问题:
1. 不停地对股票作翻页操作时出现程序挂掉的情况(直接退到提示行#下)
经分析发现是两个线程使用同一个变量而引起的数组访问越界:
程序中有这样一段代码:
for (i=0; i<ntohs(pquery_stock_rsp->cur_number); i++)
{
memcpy(&gAppstock.StockList[gAppstock.currgot],pstock, sizeof
(stock_t));
gAppstock.currgot++;
}
其中数组gAppstock.StockList的大小是固定值(PAGE_STOCK_NUM=9),代码中在一个for循环里给该数组赋值,但并没有对数组访问进行保护,故存在数组访问越界的隐患。
而在程序中有两个线程同时用到了变量gAppstock.currgot,这样就有可能出现其中一个线程使用该变量时另一个线程却在修改。故需要改的有两点:一是对使用该变量的地方加锁保护;二是对数组访问的地方加保护。
RWStock_Mutex_Lock();
if(gAppstock.currgot < PAGE_STOCK_NUM)
{
memcpy(&gAppstock.StockList[gAppstock.currgot],pstock, sizeof
(stock_t));
}
RWStock_Mutex_UnLock();
这样修改之后就解决了程序的死机问题。
结论:在进行多线程编程时务必考虑同步问题。
在对数组进行访问时务必考虑数组访问的保护问题。
2. 不停地一条一条浏览新闻时出现程序挂掉的情况(系统打出killed)
经分析引起该问题的原因可能是内存泄露,通过top命令查看内存占用情况也证实了该猜
测。
于是就需要重点检查程序中相关代码部分的malloc与free的情况。
当然有许多内存泄露的检测工具,但在这里均不太适合;于是就借用了一般内存检测工具的
基本思想,在所有malloc与free的地方做上标记,然后看malloc与free的次数是否一致,
如果malloc的次数大于free,则存在内存泄露;这时就需要再分析是哪个变量的malloc与
free的次数不一致。
经过这样的分析最后终于找到了内存泄露的地方:某一个变量malloc了空间后没有及时释
放,而在重复操作的时候再次对该变量malloc空间,这样就造成了内存泄露。
结论:malloc与free一定要成对出现。
如果在有的情况下无法做到这一点,那就需要确保在不用该变量或再次使用该变
量malloc空间之前free。
总之,在编写程序时要时刻注意可能出现的bug,不可懈怠。