2019独角兽企业重金招聘Python工程师标准>>>

目的:

本文是《一种定位内存泄露的方法(Solaris)》对应的Linux版本,调试器使用gdb。主要介绍实例部分。其他请见《一种定位内存泄露的方法(Solaris)》。

实例:

模拟new失败的程序:

#include <stdexcept>

class ABC

{

public:

virtual ~ABC(){}

int i;

int j;

};

void f()

{

for (int i = 0; i < 1000; ++i)

{

ABC* p = new ABC;

}

throw std::bad_alloc();

}

int main()

{

f();

return 0;

}

1) 编译运行此段代码。产生一个core文件

2) 用gdb打开这个core文件:

gdb a.out core

(gdb) run

Starting program: /test/new_fail/a.out

terminate called after throwing an instance of 'std::bad_alloc'

what():  std::bad_alloc

Program received signal SIGABRT, Aborted.

0x00007ffff733f645 in raise () from /lib64/libc.so.6

(gdb) info proc

process 10683

cmdline = '/test/new_fail/a.out'

cwd = '/test/new_fail'

exe = '/test/new_fail/a.out'

(gdb) shell pmap 10683

10683: a.out

START               SIZE     RSS     PSS   DIRTY    SWAP PERM MAPPING

0000000000400000      4K      4K      4K      0K      0K r-xp /test/new_fail/a.out

0000000000600000      4K      4K      4K      4K      0K r--p /test/new_fail/a.out

0000000000601000      4K      4K      4K      4K      0K rw-p /test/new_fail/a.out

0000000000602000    132K     32K     32K     32K      0K rw-p [heap]

…(略)

Total:            11468K   1048K    684K    180K      0K

360K writable-private, 11108K readonly-private, 0K shared, and 1048K referenced

可以看到heap空间的起始地址是0x0000000000602000,共132K字节,即132*1024=135168字节。

3) 因为是64位应用程序,所以指针占8字节。所以需要遍历的指针个数为135168/8=16896。

4) 将结果输出到日志文件gdb.txt中:

(gdb) set height 0

(gdb) set logging on

Copying output to gdb.txt.

(gdb) x/16896a 0x0000000000602000

gdb.txt的内容:

0x602000:       0x0     0x21

0x602010:       0x400b30 <_ZTV3ABC+16>  0x0

0x602020:       0x0     0x21

0x602030:       0x400b30 <_ZTV3ABC+16>  0x0

….

5) 过滤gdb.txt:

awk '{print $2"/n"$3}' gdb.txt|c++filt|grep vtable>gdb_vtable.txt

gdb_vtable.txt的内容为:

<vtable for ABC+16>

<vtable for ABC+16>

<vtable for ABC+16>

<vtable for ABC+16>

….

6) 将gdb_vtable.txt的内容导入到SQLServer中(如果记录不多,可以用Excel代替)。表名为gdb_vtable,第一列Col001为符号。对其分组求和:

select Col001, count(1) quantity from gdb_vtable

group by Col001

order by quantity desc

结果为:

Col001                                                                                    quantity

<vtable for ABC+16>                                                              1000

<vtable for std::bad_alloc@@GLIBCXX_3.4+16>                1

可知core里有1000个ABC,遍历使用ABC的代码,可知存在泄漏。

转载于:https://my.oschina.net/kaixindewo/blog/28526

一种定位内存泄露的方法(Linux)相关推荐

  1. 利用linux的mtrace命令定位内存泄露(Memory Leak)

    一谈到内存泄露, 多数程序员都闻之色变. 没错, 内存泄露很容易引入, 但很难定位.  以你我的手机为例(假设不经常关机), 如果每天泄露一些内存, 那么开始的一个星期, 你会发现手机好好的, 当内存 ...

  2. 如何使用Eclipse内存分析工具定位内存泄露

    本文以我司生产环境Java应用内存泄露为案例进行分析,讲解如何使用Eclipse的MAT分析定位问题 一. 背景 11月10号晚上8点收到报警邮件,一看是OOM 打开公司监控系统查看应用各项指标发现J ...

  3. github snap android,GitHub - albuer/heapsnap: HeapSnap 是一个定位内存泄露的工具,适用于Android平台。...

    HeapSnap 1.HeapSnap 是什么 HeapSnap 是一个定位内存泄露的工具,适用于Android平台. 主要特性如下: 对系统负载低 不需要修改目标进程的源代码 支持Andoroid上 ...

  4. Android Studio 选项菜单和动画结合_Android性能测试③-发现和定位内存泄露amp;卡顿...

    Android性能测试③-发现和定位内存泄露&卡顿 Android用户也许会经常碰到以下的问题: 1)应用后台开着,手机很快没电了--应用耗电大: 2)首次/非首次启动应用,进入应用特别慢-- ...

  5. 更灵活的定位内存地址的方法02 - 零基础入门学习汇编语言33

    第七章:更灵活的定位内存地址的方法02 让编程改变世界 Change the world by program [bx+idata] 在前面,我们可以用[bx]的方式来指明一个内存单元, 我们还可以用 ...

  6. linux如何定位内存泄漏,快速定位内存泄漏的套路(linux)

    快速定位内存泄漏的套路(linux) 快速定位内存泄漏的套路(linux) https://blog.csdn.net/xieyihua1994/article/details/105248362/ ...

  7. 使用Windbg定位内存泄露

    在网上看了两篇文章,整理一下,大致内容如下: 场景一:运行Debug版本程序,用Windbg attach 上去,等程序退出时,基于内存泄露报告,定位内存泄露的位置. 首先使用windbg工具gfla ...

  8. JVM内存调优原则及几种JVM内存调优方法

    JVM内存调优原则及几种JVM内存调优方法 1.堆大小设置. 2.回收器选择. 1.在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因 ...

  9. 更灵活的定位内存地址的方法---汇编学习笔记

    更灵活的定位内存地址的方法 前面,我们用[0].[bx]的方法,在访问内存的指令中,定位内存单元的地址.本章将用更灵活的方式来定位内存地址. 7.1 and和or指令 (1)and指令:逻辑与指令,按 ...

最新文章

  1. Thread.sleep() SystemClock.sleep()
  2. mysql异步查询 java_java 手写并发框架(一)异步查询转同步的 7 种实现方式
  3. Angular页面发生更新时,更新如何从view层传递到model层
  4. spring-core
  5. 需求分析师的基本功:逻辑思维、逻辑分析与逻辑表达
  6. 菜鸟入门【ASP.NET Core】6:配置的热更新、配置的框架设计
  7. python钓鱼网站_学习笔记6.0 Django入门创建一个钓鱼网站
  8. WebStorm 9“神器”变“霸器”
  9. 7-26 币值转换 (20 分)
  10. 神舟笔记本风扇偏移调多少_神舟战神怎么调节风扇我们该办正事了
  11. 测试图片色域软件,显示器色域检测
  12. CentOS7 分区合并
  13. 新年祝福短信app(源码)
  14. 计算机组装需要注意什么东西,组装一台计算机需要注意那些问题?
  15. Pandas DataFrame.columns用法及代码示例
  16. selenium批量处理出现页面加载不全现象
  17. 3D动画片《不一样的卡梅拉》(小鸡来了) 中文版高清 23集,法国名著改编
  18. asp.net webs制作(包括连接数据库)
  19. PS切片为什么会切出很多不想切的东西呢?
  20. css 背景平铺 控制范围,css如何让背景图片平铺?css背景图片平铺四种方式介绍...

热门文章

  1. socket io与vue-cli的结合使用
  2. 不知道这些肯定没学过Go语言
  3. 如果说编程语言是一种宗教,你的信仰是?
  4. 论一名项目经理的能力素养
  5. ContentObserver类的使用
  6. Greenplum Hadoop分布式平台大数据解决方案实战教程
  7. 【权值分块】bzoj1503 [NOI2004]郁闷的出纳员
  8. 博客园模板 样式优化
  9. Using the New MySQL Query Profiler
  10. 1123: 零起点学算法30——参加程序设计竞赛