[FAQ19076]如何查看slub内存申请/释放的调用栈

这篇博客介绍了如何在遇到Linux内核slub内存问题时,通过eng版本的slub debug功能来查看内存申请和释放的调用栈。在获取minidump或ramdump后,根据slub内存布局找到存放调用栈的位置,并使用特定工具解析和转换地址,最终通过addr2line转换为函数名,从而定位use after free等内存问题。
摘要由CSDN通过智能技术生成
[DESCRIPTION]
踩内存是最难调试的问题之一,kernel里大部分kernel结构体都是从slub分配出去的,因此slub踩内存也是常见的问题。
通常遇到踩内存,我们会切换的eng版本复现,eng版本有开slub debug功能,会对free memory填充0x6b,pad填充0x5a等等,同时还会记录申请和释放的调用栈,可以轻易查出use after free问题。
下面将给出查看slub内存申请/释放的调用栈的方法。
 
[SOLUTION]
在eng版本,抓到minidump或ramdump情况下,如果有dump到slub memory,那么可以根据slub memory layout找出存放申请/释放的调用栈的位置,推导出申请/释放调用栈。具体位置看对应的代码就知道了:
[C/C++] hide
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static struct track *get_track( struct kmem_cache *s, void *object, enum track_item alloc)
 
{
 
     struct track *p;
 
 
 
     if (s->offset)
 
        p = object + s->offset + sizeof ( void *);
 
     else
 
         p = object + s->inuse;
 
 
 
     return p + alloc;
 
}
可以看到是放在后面,已下面的例子来讲:
[C/C++] hide
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值