内存泄漏/内存安全如何排查

1、代码不多,并且比较熟悉的话。可以直接检查代码(malloc,free,newdelete是否成对使用,析构函数没有用虚函数?fork的时候父进程的资源比如fd没有释放?垂悬指针等等)。也可以直接gdb调试,step/断点。就能知道哪一步出错了。 对于内存泄漏来说,如果一开始就分配很大内存泄漏的话直接提示错误信息了。

2、代码很多不熟悉。
使用检测工具比如varglind lea check -fully。它会告诉你肯定泄漏的地方,可能泄漏的地方,间接泄漏的地方。对于肯定的,修改就好,而可能,间接的需要再考虑。

3、coredump文件
有的内存泄漏导致崩溃是会产生core文件的,比如内存泄漏导致堆栈溢出。ulimit可以查看是否启用以及大小限制。里面保存的是当时内存的状态,比如寄存器的值,堆栈指针,函数调用等信息。
core文件一开始就会告诉你是哪种错误(比如内存泄漏)。可以gdb调试一下core文件,比如调用bt命令查看出错时函数调用栈帧信息,frame查看某个栈帧更具体的信息。然后在相应函数位置打断点,看看哪一步出错了。有一个addr2line的工具,可以把内存地址信息转换成相应的函数名行数,分析更方便;
(core异常出现的其他原因比如:读写越界,除零异常,kill信号,多线程共享的数据结构没加锁,非法指针等)
4、重载malloc
如果说core的时候已经不是第一现场了,可能出错的地方根本不在这里,尤其是使用一些其他的库,这些库底层到底使用了什么动态分配的机制我们不了解,就很容易内存泄漏。所以可以重载malloc,free写日志,比如写的是xxx函数分配了哪里的多大的内存,free就反过来,这样分析哪里出现泄漏了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值