分类: LINUX
2008-10-25 20:20:24
时间:2008-10-21
问题描述:新增加的某个网络协议栈相关的统计计数,使用atmoic_t类型的计数做了计算后导出到proc,此计数只有加和读操作,却能从proc下读出负值...
首先,查看了相关代码,确认只有加和读操作,并且已经处理过回绕问题,所以正常的操作,就这个值本身来说,不会变为负值。
其次,发现计算中使用了除法,但是整数除法应该不会引发问题。
接下来,插入printk语句,打印相关计算中读取与操作的值,注意到算式里面atomic_t * 1000 * 1000的做法,这种情况下,int大小的atomic_t会overflow,加上其他计算部分,就会表现为奇怪的-1234类的负值了。
怀疑过的相关问题:结构体的内存对齐、回绕处理错误、数值越界。
想起来记在这里的相关问题,多核的机器上,printk打印是乱序的,有些信息要想依赖顺序进行区分和判断就会变得比较麻烦,但是可以使用一些技巧解决。另外,大量的printk是个危险的,对于调试来说,也应该控制。