您的位置:首页 > 其它

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

2016-10-14 16:52 309 查看
[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

可以看到是放在后面,已下面的例子来讲:

[C/C++]hide

0xBB是redzone,那么track起始地址是0xFFFFFFC08167F810,用trace32可以case出2个track结构体内容:

[C/C++]hide

其中第0个是申请时的信息,addrs是申请调用栈,第1个是释放的信息,addrs是释放调用栈。

如果是64位OS的话,还需要将32位地址转换为64位地址才行。看代码就知道如何转换了:

[C/C++]hide

只要加上MODULES_VADDR就可以。

然后再通过addr2line转换为具体的函数名,就可以看到调用栈了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: