内存深度检测利器 -- Valgrind
更新日期:
前言
Valgrind本是程序员界的瑞士军刀已经是老生常谈了,很久很久以前就一直想写一个专题来专门介绍一下Valgrind,但一直没有找到机会.
今天写这个总结,主要是记录一下当遇到常见且不易发现的程序问题时,一定要记得还有一个叫Valgrind的工具可以供你使用!
事情经过
2014-12-26
事件描述
某某公司线上机发生大规模同一时间点CORE掉,切记是基本处于同一机房同一机架的线上机同时CORE掉,发生周期固定,可能是每周一次,也可能是每月一次,其它机房同一时间点没有任何问题。
问题原因
问题原因:当处于特定网络请求环境下,产生程序内部异常。这一特定网络请求,不是正常理论所能假设的,即在正常的理论下,是不可能存在的,也不可能有Client能够发出这一请求,所以很容易被程序员们所忽略。比如:
- 处于应用层协议的网络服务,如HTTP或HTTP2/SPDY等,是否可以对错误的请求进行容错。即当发生在理论上不能够判断为HTTP协议的请求进行多层伪装,让你的服务识别为正确的协议了,进而导致不可预知的错误。
- 处于传输层交换数据的网络服务,是否容错了非正常TCP/UDP请求的伪装。
- 处于网络层与数据链路层的网络服务,是否容错了非正常的BT请求伪装(这种情况在网络服务上也很少见,发生错误的可能性更大)。
致谢
伪装请求是一个更具有技术难度的活,不是一般人可以达到的。不过这也成就了更可靠的服务引擎设计,更大的容错性。在此一并致谢那些试图攻击、入侵公司服务器的..客们,也更感谢..公司信息安全部的大力扫描,有了你们,才能够发现正常测试同学进行性能压测所发现不了的问题,对于上述事件,..公司压力测试可以进行了为期二个月,也并未发现任何问题,可就是线上不定期CORE掉,最长发生周期达六个月。
2016
事件描述
当一个可执行程序A动态链接了动态链接库B,编译期B的版本为1.0,编译通过,执行成功。但线上安装包时,安装成功,服务正常启动。只是当特定处理逻辑执行时,直接挂掉,服务异常停止,切记不是CORE掉,自然也没有CORE文件产出,即使设置了ulimit -c unlimited.
问题原因
问题原因:线上机执行环境B安装了错误版本,与编译期使用版本不一致。比如:安装了B的0.8版本,导致一些对象在低版本上未定义
,此时会导致执行到new时,可能会发生程序异常退出。但不会CORE掉,较难定位问题原因。
Valgrind
发上事件描述问题较难定位,但均可通过Valgrind轻松解决. 在此,本人只是推荐这个工具而已,具体使用方法可参考官方文档。有任何问题,欢迎交流.
出于商业原则,以上问题已经针对具体事实作了必要屏蔽,还请谅解。