Pmap可以查看堆地址信息(程序中new/malloc出来的空间),然后gdb调试查看堆较大的内存块数据信息。(本次测试只是使用了这个功能,是否还有其他牛逼的功能不知道)

  1. 编写测试代码

#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;

}

  1. 编译生成文件后执行,输出信息如下

$ ./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

  1. 以此执行下面的命令

    1. ps -ef|grep a.out    7972 15451 90 14:23 pts/1  00:00:07 ./a.out找到程序的进程号
    2. gdb attach 7972
    3. 进入程序之后执行c,然后ctrl +C回到命令输入状态
    4. 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查看内存泄露相关推荐

  1. Linux下查看内存泄露的命令

     一.   Linux下确定内存泄露 在做嵌入式开发中,例如,在 Linux 下做 C/C++ 开发,会因为调用 malloc/calloc() 函数,忘记释放堆内存.程序运行久了,会发生内存泄露问题 ...

  2. java查看内存泄露_Java内存泄露如何排查

    Java内存泄露是常常出现的问题,Java攀登网进行了该问题的整理,具体的如下所示: 1.2 内存泄露Memory Leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内 存泄露危害可以忽略 ...

  3. openssl内存分配,查看内存泄露

    openssl内存分配  用户在使用内存时,容易犯的错误就是内存泄露.当用户调用内存分配和释放函数时,查找内存泄露比较麻烦.openssl提供了内置的内存分配/释放函数.如果用户完全调用openssl ...

  4. pmap定位内存泄露

    1,#查看系统内存分配情况 pmap -x $pid | sort -k3 -n 可看到如下展示: 00007fb775800000 8192 6876 6876 rw- [ anon ] 00007 ...

  5. 前端内存泄漏及前端如何利用调试工具查看内存泄露

    内存泄漏又叫做Detached DOM node(脱离文档的节点) javascript垃圾回收机制常见的两种方法: 引用计数算法 标记清除算法 引用计数法 IE使用的是引用计数算法, 这种方法无法解 ...

  6. pmap anon 内存泄露

    refer: http://blog.csdn.net/kenanxiuji/article/details/48547285 pmap -d 3050 输出:00007fc72fa99000   1 ...

  7. Xcode6.3 怎样使用Leaks查看内存泄露

    Xcode -> Open Developer Tool -> Instruments : Leaks: 选择要检測的程序: 界面详情:

  8. Linux下内存泄露排查讨论

    作为c的程序员,最常见的就是排查内存泄漏,不过我们一般的内存泄漏是针对特定的程序去排查,相对来说比较容易,但是如果是维护人员,不知道哪个程序有内存泄漏,甚至是应用程序的内存泄漏,还是内核的内存泄漏都不 ...

  9. Spring Boot 还能“内存泄露”?排它!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:美团技术团队(纪兵) 8rr.co/38Kh 排查过程 1. ...

最新文章

  1. php set medias,laravel5.1 -- Integrate FileManager and CKeditor into laravel
  2. 树上启动式合并问题 ---- D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths [状态压缩+树上启发式合并]
  3. python中线条颜色_python中plot用法——线条、点、颜色
  4. 如何从Spring官网中下载完整的jar包(包含5.2.9版本最新版详解,当然所有版本均可下载)
  5. 关于mysql数据库的外键插入报错:Cannot add or update a child row: a foreign key constraint fails,完整性问题
  6. Android之面试题总结加强版(一)
  7. neo4j数据浏览器_Neo4j:在Neo4j浏览器的帮助下探索新数据集
  8. hashset java_Java HashSet clear()方法与示例
  9. ProPublica Illinois如何每天使用GNU Make加载1.4GB数据
  10. 【Java数据结构与算法】第十三章 二叉排序树和平衡二叉树
  11. linux 安裝 curl的 dev 包,R包:RCurl和curl包在Linux上安装失败
  12. 角谱 matlab,关于角谱法实现数字全息 - 程序语言 - MATLAB/Mathematica - 小木虫论坛-学术科研互动平台...
  13. SQL server 2008 r2 安装出错 Could not open key:
  14. coreseek mysql_centos+php+coreseek+sphinx+mysql之一coreseek安装篇
  15. Eclipse+Wildfly10 创建第一个EJB项目
  16. 计算机解决最小二乘法的过程,线性最小二乘法在计算机化学中的应用.doc
  17. CST材料库相关问题
  18. 3G技术演进策略(cdma2000,UMTS)
  19. SSL基础:25:一键生成HTTPS服务器所用证书
  20. 专访百度资深工程师孙源:代码强迫症的死实践派

热门文章

  1. [转]关于游戏架构设计的一些整理吧
  2. EXCEL中替换换行符、回车符
  3. Python 爬取CCTV视频
  4. 粮油食品订货系统可以帮助行业解决哪些问题
  5. 关于3dsmax出现“应用程序无法正常启动0xc000007b”的解决方案
  6. 微信公众号接入(参考微信开放文档记笔记)
  7. 给博客添加红灯笼效果
  8. α振荡在工作记忆保留中的作用
  9. c语言 怎么输出结点,c语言 线索二叉树 输入结点 输出前驱后继,大神们救命啊!!1...
  10. C++多态及重载(overload),覆盖(override),隐藏(hide)的区别