问题背景

设备项目上线,设备支持SNMP协议,提供tcpserver二次开发接口,支持动环系统平台的对接;设备安装数据中心机房,运行一天后查看动环平台,发现设备运行数据缺失。



问题排查
1、打开cmd命令窗口,进行telnet远程登录设备,进入命令行界面;
2、执行ps命令,发现tcpserver进程已经挂掉;
3、断电重启设备,执行ps命令,观察到tcpserver进程已启动;
4、经过半天时间后,动环系统再次无法检测到设备运行数据;
5、分析问题:设备运行一段时间后,进程无缘无故挂掉;分析可能是资源不足的问题;
6、在设备命令行界面执行top命令,查看内存使用情况,测试分析现象;
关于Linux下进程无故挂掉问题的分析_进程挂掉
7、查看分析,随着设备运行,可使用的内存空间不断减少,内存不断在消耗;
8、查看代码分析,是否是动态内存malloc之后没有free,导致内存越来越大;
9、代码查看结束,其中每次malloc之后都进行free,两函数成对出现;
10、再次分析原因,动环检测平台上设备的运行数据是从共享内存中读取,查看共享内存是否存在问题;
11、查看代码,发现每次对共享内存shmget初始化进行shmat操作后,没有对共享内存shmdt;
12、修改代码,每次shmget后调用shmdt,使程序与共享内存脱离;
13、覆盖最新程序,重启设备,再次在命令行界面执行top检测内存使用情况;
14、发现可用内存基本保持稳定;



问题解决结论
程序编写时,对共享内存函数的调用缺乏严谨性;对内存方面的函数调用时谨记打开关闭成对出现;



最后推荐一个公众号,一枚IT技术人成长路上关于生活和职场的思考,欢迎书友们前来交流和分享心得

关于Linux下进程无故挂掉问题的分析_共享内存_02