1
一个比较隐蔽的死锁bug
在测试代码的过程中,发现有大概百分之一的概率会出现一个死锁bug。进过仔细检查,发现加锁,解锁的地方是没有问题的。实在找不到问题的原因了,一狠心在每次加锁和解锁之后,将rwlock_t中的lock值打印出来。 每次write_unlock之后,那个值本应该是0的,但在出现问题的时候,发现那个值一个乱码。于是怀疑是锁占的那块内存被写掉了(内存越界)。后来调试发现, 由于在结构体中 rwlock_t 是放在最后的位置上的,它前面还有个字符数组,由于往字符数组里写东西的时候,没有强制长度(写的随机数)。因此发生由于内存越界导致的死锁。
2
内核栈溢出引起的bug
现象:
在内核schedule函数里面发生panic,提示schedule处于原子上下文中(in_atomic()为1 ,即当前thread_info的preempt_count不为0)。进过加log调试发现,preempt_count是突然变成一个很大的数的。
这种现象比较容易重复,提示的panic信息也相同。
猜测:
是内核栈溢出。 因为内核栈和thread_info共用8k的内存,因为内核栈溢出,把thread_info中的preempt_count值冲掉了,所以出现了奇怪的panic。
验证:
在函数内部申请一个局部变量,如果该局部变量的地址,小于thread_info里面preempt_count的地址,则猜想成立。
这是因为栈是向低地址增长的。
注意:
在内核编程中一定要防止递归调用和分配局部大数组,因为它们都有可能引发内核栈溢出
3
由于进行强转了结构,导致对结构里面的指针进行错误操作。引起的vfree()bad address.
现象:
提示vfree()bad address. (引起这个问题的另外一个原因是,kmalloc分配的内存,用vfree来释放)
注意:
进行结构强转时,一定要注意,会不会对强转后的结构里面的成员,做特殊操作。
4
关于cache pool Cann't free all objects
以前碰到这种情况 都是由于slab_cache 中有块没有被释放,但是今天碰到了由于某个指针所在的结构没有被初始化,导致多被mempool_free了一次, 最终导致了这种情况。
5
今天调一个bug,始终找不到问题的原因。最后发现 是因为变量越界的问题。
将一个int型的变量 左移 64位,就会出现意想不到的错误。