一种定位内存泄露的方法(Linux)

转载 2015年07月10日 10:42:39

http://www.cppblog.com/sleepwom/archive/2012/03/26/168965.html

分类: C/C++Linux 2010-05-16 18:35 612人阅读 评论 (0) 收藏 举报

目的:

本文是《一种定位内存泄露的方法( 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 的代码,可知存在泄漏。


一种定位内存泄露的方法(Linux)

本文是《一种定位内存泄露的方法(Solaris)》对应的Linux版本,调试器使用gdb。主要介绍实例部分。其他请见《一种定位内存泄露的方法(Solaris)》。 实例: 模拟new失败的程序: ...
  • mergerly
  • mergerly
  • 2015年05月13日 22:10
  • 1377

Linux下内存泄漏定位常用工具介绍

写在前面: 本人只是一个linux开发新手,对linux
  • u011466536
  • u011466536
  • 2014年10月04日 10:36
  • 1665

Linux下定位内存泄漏

查看程序内存空间两种方法 一、查看/proc/{pid}/maps文件 #cat /proc/568/maps 00008000-0036a000 r-xp 00000000 00:0e 236...
  • xiongli880612
  • xiongli880612
  • 2015年11月03日 20:24
  • 1310

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

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

记录一次kernel内存泄漏的查找定位过程

Bug描述:压力测试一个小工程时发现内存逐渐减少,10个小时后出现OOMBug定位过程: 对整个工程模块进行分解,逐步缩小范围,由于整个工程包括几个相对独立的小模块,而整个工程采用单进程多线程的模型,...
  • voidreturn
  • voidreturn
  • 2017年05月17日 10:19
  • 509

GDB定位内存泄露的方法(Linux)

目的: 本文是《一种定位内存泄露的方法(Solaris)》对应的Linux版本,调试器使用gdb。主要介绍实例部分。其他请见《一种定位内存泄露的方法(Solaris)》。 实例: 模拟new失败...
  • bulecheng
  • bulecheng
  • 2012年09月17日 09:28
  • 1705

linux平台检测c/c++内存泄露方法

由于 C 和 C++ 程序中完全由程序员自主申请和释放内存,稍不注意,就会在系统中导入内存错误。同时,内存错误往往非常严重,一般会带来诸如系统崩溃,内存耗尽这样严重的后果。从历史上看,来自计算机应急响...
  • cws1214
  • cws1214
  • 2013年09月23日 14:42
  • 1287

linux c、c++高并发服务内存泄露追踪分析

最近,我一直忙于追踪分析,咱公司高并发代理服务器内存一直占用过高的问题。该问题表现如下,使用python脚本压测,服务器使用的物理内存一直飙升很快上G、虚拟内存更是高达数10G,没有下降的趋势。当压测...
  • KeNanXiuJi
  • KeNanXiuJi
  • 2015年09月19日 00:19
  • 2794

一种定位内存泄露的方法(Solaris)

问题:客户测试的镜像环境出现一个3.8G的core文件,查看堆栈发现是new失败了导致进程abort。因为是32位应用程序,应该是所有的heap空间都被用光了,导致new失败。推测有几种可能:1) 内...
  • lw1a2
  • lw1a2
  • 2010年05月15日 12:04
  • 2573

C++内存泄露的定位与解决

PCIe应用程序调试时,发现程序出现内存泄露,经过自己的摸索,以及向软件同学请教,最终解决了此问题。 1. 现象描述 应用程序开发环境为VC++,运用其debug功能进行单步调试时,程序总...
  • asr9k
  • asr9k
  • 2016年11月21日 12:44
  • 470
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一种定位内存泄露的方法(Linux)
举报原因:
原因补充:

(最多只允许输入30个字)