ITKeyword,专注技术干货聚合推荐

注册 | 登录

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

mergerly 分享于 2015-05-13

推荐:Linux上对内存泄露的测试

http://www.ibm.com/developerworks/cn/linux/l-cn-memleak/ 介绍了基本的测试类型和原理   http://blog.csdn.net/rufeng18/archive/2008/11/17/3322099.aspx ht

2018阿里云全部产品优惠券(新购或升级都可以使用,强烈推荐)
领取地址https://promotion.aliyun.com/ntms/yunparter/invite.html

本文是《一种定位内存泄露的方法(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:

推荐:VC++内存泄露定位

内存泄漏定位

今天调试程序,发现有内存泄漏但是没有提示具体是哪一行,搞得我很头疼。结果在网上搜索了一些资料,经自己实践后整理如下:

第一种:

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平台检测c/c++内存泄露方法

由于 C 和 C++ 程序中完全由程序员自主申请和释放内存,稍不注意,就会在系统中导入内存错误。同时,内存错误往往非常严重,一般会带来诸如系统崩溃,内存耗尽这

本文是《一种定位内存泄露的方法(Solaris)》对应的Linux版本,调试器使用gdb。主要介绍实例部分。其他请见《一种定位内存泄露的方法(Solaris)》。 实例: 模拟new失败的程序: #include <st

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。