[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转换为具体的函数名,就可以看到调用栈了。
踩内存是最难调试的问题之一,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
[C/C++]hide
如果是64位OS的话,还需要将32位地址转换为64位地址才行。看代码就知道如何转换了:
[C/C++]hide
然后再通过addr2line转换为具体的函数名,就可以看到调用栈了。
相关文章推荐
- C和C++如何动态申请内存和释放内存?有什么区别?
- 如何避免内存频繁地申请与释放
- 堆内存申请与释放的标准流程
- win2003中如何释放内存
- 请问如何强行释放所有已关闭的程序所残留的内存等资源?类似于微软的那个叫mem.exe的工具,如何入手呢?
- Com中内存申请和释放的规范
- 如何释放Sqlserver所占得内存
- 『EXP1』错误处理时一定要记得释放申请的内存
- 讨教:WINCE 开发中,如何让.net程序及时地释放内存,如何可以节省内存?
- 浅析嵌入式系统中大量小块内存申请释放的内存管理方案
- Delphi中如何释放内存(转)
- 高手急救!如何下载查看某个专利的全部申请资料?
- Windows 2003中如何安全的释放内存
- 如何释放sqlservr.exe所占用的内存?
- Linux用户进程是如何释放内存的
- Linux用户进程是如何释放内存的[zt]
- W3wp.exe内存占用问题以及如何查看一个网站对应的w3wp.exe(转)
- System.New、System.Dispose - 为某个指针申请和释放内存
- Linux用户进程是如何释放内存的
- WSS中的SPSite和SPWeb为什么需要释放内存,如何快速发现代码中的未释放内存