Pmap查看内存泄露
Pmap可以查看堆地址信息(程序中new/malloc出来的空间),然后gdb调试查看堆较大的内存块数据信息。(本次测试只是使用了这个功能,是否还有其他牛逼的功能不知道)
- 编写测试代码
#include <iostream>
#include <string>
#include <stdio.h>
class mem_test
{
public:
mem_test()
{
m_buffer = new char[1000*2000];
printf("memory test address: %p\n", m_buffer);
memcpy(m_buffer, "xiagaodedaqiqiu", 20);
}
private:
char *m_buffer;
};
void mem_leak()
{
char *buffer = new char[1024*1024];
printf("memory leak function address: %p\n", buffer);
memcpy(buffer, "wqb5", 5);
}
int main()
{
mem_leak();
mem_test *ptr = NULL;
for(int i = 0; i < 20; i++)
{
ptr = new mem_test;
delete ptr;
}
while(1)
{
}
return 0;
}
- 编译生成文件后执行,输出信息如下
$ ./a.out
memory leak function address: 0x7fdfc426a010
memory test address: 0x7fdfc3382010
memory test address: 0x7fdfc3199010
memory test address: 0x7fdfc2fb0010
memory test address: 0x7fdfc2dc7010
memory test address: 0x7fdfc2bde010
memory test address: 0x7fdfc29f5010
memory test address: 0x7fdfc280c010
memory test address: 0x7fdfc2623010
memory test address: 0x7fdfc243a010
memory test address: 0x7fdfc2251010
memory test address: 0x7fdfc2068010
memory test address: 0x7fdfc1e7f010
memory test address: 0x7fdfc1c96010
memory test address: 0x7fdfc1aad010
memory test address: 0x7fdfc18c4010
memory test address: 0x7fdfc16db010
memory test address: 0x7fdfc14f2010
memory test address: 0x7fdfc1309010
memory test address: 0x7fdfc1120010
memory test address: 0x7fdfc0f37010
- 以此执行下面的命令
- ps -ef|grep a.out 7972 15451 90 14:23 pts/1 00:00:07 ./a.out找到程序的进程号
- gdb attach 7972
- 进入程序之后执行c,然后ctrl +C回到命令输入状态
- shell pmap 7972查看当前程序所有堆地址信息
0000000000400000 4K r-x-- a.out
0000000000600000 4K rw--- a.out
0000000001f2d000 132K rw--- [ anon ]
00007fdfc0f37000 39120K rw--- [ anon ]
00007fdfc356b000 1804K r-x-- libc-2.17.so
00007fdfc372e000 2044K ----- libc-2.17.so
00007fdfc392d000 16K r---- libc-2.17.so
00007fdfc3931000 8K rw--- libc-2.17.so
00007fdfc3933000 20K rw--- [ anon ]
00007fdfc3938000 84K r-x-- libgcc_s-4.8.5-20150702.so.1
00007fdfc394d000 2044K ----- libgcc_s-4.8.5-20150702.so.1
00007fdfc3b4c000 4K r---- libgcc_s-4.8.5-20150702.so.1
00007fdfc3b4d000 4K rw--- libgcc_s-4.8.5-20150702.so.1
00007fdfc3b4e000 1028K r-x-- libm-2.17.so
00007fdfc3c4f000 2044K ----- libm-2.17.so
00007fdfc3e4e000 4K r---- libm-2.17.so
00007fdfc3e4f000 4K rw--- libm-2.17.so
00007fdfc3e50000 932K r-x-- libstdc++.so.6.0.19
00007fdfc3f39000 2044K ----- libstdc++.so.6.0.19
00007fdfc4138000 32K r---- libstdc++.so.6.0.19
00007fdfc4140000 8K rw--- libstdc++.so.6.0.19
00007fdfc4142000 84K rw--- [ anon ]
00007fdfc4157000 136K r-x-- ld-2.17.so
00007fdfc426a000 1048K rw--- [ anon ]
00007fdfc4376000 8K rw--- [ anon ]
00007fdfc4378000 4K r---- ld-2.17.so
00007fdfc4379000 4K rw--- ld-2.17.so
00007fdfc437a000 4K rw--- [ anon ]
00007fff3a1bb000 132K rw--- [ stack ]
00007fff3a1e0000 8K r-x-- [ anon ]
ffffffffff600000 4K r-x-- [ anon ]
从上面的输出信息可以到有一块大概400k左右的内存块地址,和程序中创建的地址差不多大小(1000*2000*20)
1、x/20s 0x00007fdfc0f37000
0x7fdfc0f37000: ""
0x7fdfc0f37001: ""
0x7fdfc0f37002: ""
0x7fdfc0f37003: ""
0x7fdfc0f37004: ""
0x7fdfc0f37005: ""
0x7fdfc0f37006: ""
0x7fdfc0f37007: ""
0x7fdfc0f37008: "\002\220\036"
0x7fdfc0f3700c: ""
0x7fdfc0f3700d: ""
0x7fdfc0f3700e: ""
0x7fdfc0f3700f: ""
0x7fdfc0f37010: "xiagaodedaqiqiu"
0x7fdfc0f37020: ""
0x7fdfc0f37021: ""
0x7fdfc0f37022: ""
0x7fdfc0f37023: ""
0x7fdfc0f37024: ""
从输出信息可以看到在pmap输出的地址偏差16字节出有用户创建的堆地址
2、x/20s 0x00007fdfc0f37000+1000
(gdb) x/20s 0x00007fdfc0f37000+1000
0x7fdfc0f373e8: ""
0x7fdfc0f373e9: ""
0x7fdfc0f373ea: ""
0x7fdfc0f373eb: ""
发现其他创建的19个堆地址并不是连续的,所有通过地址+1000并不能找到下一个用户创建的堆地址,相反执行-1000的话直接报错(不知为何),0x7fdfc0f37010地址和日志最后一行打印的地址也是对应的。
同样的方式从代码实现可以知道我们还泄露了一个1024*1024字节的内存块,从pmap输出信息可以知道:
00007fdfc426a000 1048K rw--- [ anon ]
猜测这个就是用户创建的内存空间,然后同样的方式找到内存空间的信息
(gdb) x/20s 0x00007fdfc426a000
0x7fdfc426a000: ""
0x7fdfc426a001: ""
0x7fdfc426a002: ""
0x7fdfc426a003: ""
0x7fdfc426a004: ""
0x7fdfc426a005: ""
0x7fdfc426a006: ""
0x7fdfc426a007: ""
0x7fdfc426a008: "\002\020\020"
0x7fdfc426a00c: ""
0x7fdfc426a00d: ""
0x7fdfc426a00e: ""
0x7fdfc426a00f: ""
0x7fdfc426a010: "wqb5"
0x7fdfc426a015: ""
0x7fdfc426a016: ""
0x7fdfc426a017: ""
0x7fdfc426a018: ""
0x7fdfc426a019: ""
同样在偏移16字节出有用户创建的内存空间,和日志打印对比也是对应的。
通过以上方式可以处理部分内存泄露的问题,关键主要有两点,1、能通过pmap找到内存卡地址,这里由于很明显程序创建了一个20个20k大小的空间未释放,然后pmap输出了一个大小差不多400k的快地址,那么很容易对应到泄露源地址。2、找到地址之后,能通过地址的数据内容对应到代码中的数据结构,这里因为程序中将buffer初始化了“xiagaodaqiqiu”这个字符串也是很容易就找到了
Pmap查看内存泄露相关推荐
- Linux下查看内存泄露的命令
一. Linux下确定内存泄露 在做嵌入式开发中,例如,在 Linux 下做 C/C++ 开发,会因为调用 malloc/calloc() 函数,忘记释放堆内存.程序运行久了,会发生内存泄露问题 ...
- java查看内存泄露_Java内存泄露如何排查
Java内存泄露是常常出现的问题,Java攀登网进行了该问题的整理,具体的如下所示: 1.2 内存泄露Memory Leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内 存泄露危害可以忽略 ...
- openssl内存分配,查看内存泄露
openssl内存分配 用户在使用内存时,容易犯的错误就是内存泄露.当用户调用内存分配和释放函数时,查找内存泄露比较麻烦.openssl提供了内置的内存分配/释放函数.如果用户完全调用openssl ...
- pmap定位内存泄露
1,#查看系统内存分配情况 pmap -x $pid | sort -k3 -n 可看到如下展示: 00007fb775800000 8192 6876 6876 rw- [ anon ] 00007 ...
- 前端内存泄漏及前端如何利用调试工具查看内存泄露
内存泄漏又叫做Detached DOM node(脱离文档的节点) javascript垃圾回收机制常见的两种方法: 引用计数算法 标记清除算法 引用计数法 IE使用的是引用计数算法, 这种方法无法解 ...
- pmap anon 内存泄露
refer: http://blog.csdn.net/kenanxiuji/article/details/48547285 pmap -d 3050 输出:00007fc72fa99000 1 ...
- Xcode6.3 怎样使用Leaks查看内存泄露
Xcode -> Open Developer Tool -> Instruments : Leaks: 选择要检測的程序: 界面详情:
- Linux下内存泄露排查讨论
作为c的程序员,最常见的就是排查内存泄漏,不过我们一般的内存泄漏是针对特定的程序去排查,相对来说比较容易,但是如果是维护人员,不知道哪个程序有内存泄漏,甚至是应用程序的内存泄漏,还是内核的内存泄漏都不 ...
- Spring Boot 还能“内存泄露”?排它!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:美团技术团队(纪兵) 8rr.co/38Kh 排查过程 1. ...
最新文章
- php set medias,laravel5.1 -- Integrate FileManager and CKeditor into laravel
- 树上启动式合并问题 ---- D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths [状态压缩+树上启发式合并]
- python中线条颜色_python中plot用法——线条、点、颜色
- 如何从Spring官网中下载完整的jar包(包含5.2.9版本最新版详解,当然所有版本均可下载)
- 关于mysql数据库的外键插入报错:Cannot add or update a child row: a foreign key constraint fails,完整性问题
- Android之面试题总结加强版(一)
- neo4j数据浏览器_Neo4j:在Neo4j浏览器的帮助下探索新数据集
- hashset java_Java HashSet clear()方法与示例
- ProPublica Illinois如何每天使用GNU Make加载1.4GB数据
- 【Java数据结构与算法】第十三章 二叉排序树和平衡二叉树
- linux 安裝 curl的 dev 包,R包:RCurl和curl包在Linux上安装失败
- 角谱 matlab,关于角谱法实现数字全息 - 程序语言 - MATLAB/Mathematica - 小木虫论坛-学术科研互动平台...
- SQL server 2008 r2 安装出错 Could not open key:
- coreseek mysql_centos+php+coreseek+sphinx+mysql之一coreseek安装篇
- Eclipse+Wildfly10 创建第一个EJB项目
- 计算机解决最小二乘法的过程,线性最小二乘法在计算机化学中的应用.doc
- CST材料库相关问题
- 3G技术演进策略(cdma2000,UMTS)
- SSL基础:25:一键生成HTTPS服务器所用证书
- 专访百度资深工程师孙源:代码强迫症的死实践派
热门文章
- [转]关于游戏架构设计的一些整理吧
- EXCEL中替换换行符、回车符
- Python 爬取CCTV视频
- 粮油食品订货系统可以帮助行业解决哪些问题
- 关于3dsmax出现“应用程序无法正常启动0xc000007b”的解决方案
- 微信公众号接入(参考微信开放文档记笔记)
- 给博客添加红灯笼效果
- α振荡在工作记忆保留中的作用
- c语言 怎么输出结点,c语言 线索二叉树 输入结点 输出前驱后继,大神们救命啊!!1...
- C++多态及重载(overload),覆盖(override),隐藏(hide)的区别