今天遇到一个因内存泄露导致的coredump,服务器内存瞬间耗干,产生一个100g+大的coredump文件。coredump进行了10min,硬盘差点就没空间了。。。后来定位发现是由于使用linux内核的通用链表导致的问题,相同的节点加链表两次导致一个节点陷入死循环,以致内存瞬间耗干。
下面来看一下linux通用链表相同的节点加链两次这种bug会产生怎么样的后果:
先看加链的源代码:
static inline void __list_add(struct list_head *new1,
struct list_head *prev,
struct list_head *next)
{
next->prev = new1;
new1->next = next;
new1->prev = prev;
prev->next = new1;
}
static inline void list_add_tail(struct list_head *new1, struct list_head *head)
{
__list_add(new1, head->prev, head);
}
原始的链表:
使用
list_add_tail将第3个节点再次加链之后:
所以此时一旦遍历链表就会陷入死循环。
mark一下,有时间整理一下linux源码链表相关,,以及coredump相关
阅读(2423) | 评论(0) | 转发(0) |