关于资源泄漏导致程序崩溃的调查

由于程序使用的资源都是有限的,如果程序使用的资源超出限制,有可能
导致程序崩溃,分享几个程序资源使用分析的方法:
1.fd资源分析
fd资源涉及socket、popen、open等系统函数或资源使用,在默认的情况下这些资源共计1024个,这个可以通过ulimit -a 查看,例如下图:

在这里插入图片描述
如果使用的socket资源和popen资源超过1024个,那么使用的时候很有可能造成资源泄漏。这个时候很有可能没有core文件,但是程序却崩溃了。
调查方式:
编写脚本如下:
#bin/bash
#date:2018-11-29
#author:caichm
while [ 1 ]
do
cd /proc/$1/fd
ls -lh | wc -l
sleep 1
done

这个脚本会每一秒查看一下fd资源,如果这个资源移植递增,那么这个程序在跑一段时间后会崩溃,这个时候需要调查socket资源、popen资源、open资源等。
2.socket资源检查
socket是普遍使用的通信方式,但是由于soket资源在使用的时候由于网络原因或其他原因导致socket断开,但是由于断开时序没有执行完毕,导致资源不能完全释放,导致资源泄漏。
调查方式:
socket资源在linux系统中有明确的记录及表示,使用的命令是netstat,netstat命令可以将网络状态全部显示出来,
netstat -nat 可以将全部的tcp连接状态表示出来,如下图示:
在这里插入图片描述
里边会明确的表示出连接上方的ip端口号及socket状态,正常连接并通信的状态是established状态。 如果出现有两个的ip和端口号相同但是state状态不同的,则代表socket资源有泄漏,此时必须处理。
3.内存资源
虽然malloc和free只有简单的两个函数,但是在使用的过程中,经常会出现由于资源没有及时释放导致资源泄漏。
调查方法:
①使用top信息,在top信息中会表示出内存的变化状态。
②使用free命令,free命令会将系统的整体内存资源打印出来,通过输出可已看出资源的使用情况。
③观察暗度进程的内存使用,如果资源是呈现递增趋势,那么资源有泄漏。
4.虚拟内存
虚拟内存是很多人都不注意的一个方面,虚拟内存在内核和用户层的分配一般是1:3,一般的嵌入式系统都是32位,所以虚拟内存一般是3G左右,如果虚拟内存泄漏,会导致线程创建失败等原因。
一般情况下产生内存泄漏的函数是县城创建函数,pthread_create函数会创建一个线程出来,同时分配一定量的虚拟内存。
虚拟内存可以通过ulimit -a 查看,下图中我的虚拟内存是8M
在这里插入图片描述
调查方法:
虚拟内存可以通过top命令去分析,top命令会将内个进程/线程的虚拟内存输出出来,通过观察内存的增长情况可以分析出是否有虚拟内存泄漏。
如有问题欢迎留言联络。

展开阅读全文

没有更多推荐了,返回首页