一次内存分配检查的经过

头说,我们的程序占用内存太高了. 某同事说发现了一个500M的内存分配. 曰:
我只是使用strace工具跟踪了一下大内存分配mmap系统调用.
一个超大的内存,系统会使用mmap实现页面映射.
man strace

我想知道是在哪里申请的这片内存.
于是我做了几个事情:
1 在分配内存的函数处增加printf输出
2 gdb调试,用条件断点

看上去都很简单,一一说来.
1 在分配内存的函数处增加printf输出
事实上,分配内存的函数声明在公共头文件,实现确是在另一个动态库中. 改不到那个动态库的代码,囧.
于是用了一个看上去很诡异的办法.
原本是
void* func1( size_t ulSize);

改成
#define func1(ulSize) func1_hack(ulSize);
void* func1_hack( size_t ulSize);

用宏替换. 然后在一个cpp里面 把实现藏在这里, 加上了printf输出
#ifdef func1
#undef func1
#endif
extern void* func1( size_t ulSize);
void* func1_hack( size_t ulSize);
{
printf("func1 %u bytes\n", ulSize);
return func1(ulSize);
}
#define func1(ulSize) func1_hack(ulSize);
因为宏的优先级比函数高啊,这样能用
额外需要修改的是, 代码中有使用func1函数地址的需要修改. 把函数地址指向func1_hack就ok了.

编译,验证一下. 看见打屏输出很愉快.

2 gdb调试,用条件断点
首先gdb xxx 这里xxx是我的程序
然后break func1_hack
然后info break看一下刚才的断点的编号. 假定是1
最后condition 1 ulSize>1000000 这个意思是在func1_hack中,当参数ulSize的大小大于1000000时触发断点.

下面是很愉快的启动程序run
循环查看断点出的堆栈然后恢复执行bt, c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值