Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1872428
  • 博文数量: 283
  • 博客积分: 10141
  • 博客等级: 上将
  • 技术积分: 2931
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-21 14:33
文章分类

全部博文(283)

文章存档

2013年(2)

2012年(2)

2011年(17)

2010年(36)

2009年(17)

2008年(18)

2007年(66)

2006年(105)

2005年(20)

分类: LINUX

2008-10-25 20:20:24

时间:2008-10-21

问题描述:新增加的某个网络协议栈相关的统计计数,使用atmoic_t类型的计数做了计算后导出到proc,此计数只有加和读操作,却能从proc下读出负值...

首先,查看了相关代码,确认只有加和读操作,并且已经处理过回绕问题,所以正常的操作,就这个值本身来说,不会变为负值。

其次,发现计算中使用了除法,但是整数除法应该不会引发问题。

接下来,插入printk语句,打印相关计算中读取与操作的值,注意到算式里面atomic_t * 1000 * 1000的做法,这种情况下,int大小的atomic_toverflow,加上其他计算部分,就会表现为奇怪的-1234类的负值了。

怀疑过的相关问题:结构体的内存对齐、回绕处理错误、数值越界。


想起来记在这里的相关问题,多核的机器上,printk打印是乱序的,有些信息要想依赖顺序进行区分和判断就会变得比较麻烦,但是可以使用一些技巧解决。另外,大量的printk是个危险的,对于调试来说,也应该控制。

阅读(1732) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~