void YCY_power_start();void YCY_power_finish();int process(const Request& req, Response& resp) //the process function of your server{YCY_power_start(); //enable YCY mem record/* your processing code */YCY_power_finish(); //req processing finish, all malloced mem should be freed here}
背景
近来有部分程序员不努力提高自身技术水平,妄图通过拜超越保证自己服务器的稳定运营: 对此,我们正统村民程序员对这样的不相信科学的行为表示鄙视: 为了在程序员当中正确推广杨超越这一形象的影响力,我们决定开发一款帮助程序员利用YCY之力定位并且修复内存泄漏的工具。 这款工具的主要指导思想正是来源于超越的著名论断: “这个世界上很多幸运的事会平均地分给每一个人的,你这次可能没有那么幸运,可是下一次你一定会比比人更幸运的。” 翻译过来就是: “这个检测工具会公平地记录每一片内存的分配,这次内存泄漏可能被没有识别出来,可是多跑很多次检测之后内存泄漏的地方就会自动被发现出来”
原理
简单来说,这工具的基本原理如下: 1、YCY之力注入 通过hook malloc、free系列函数对程序的内存分配进行跟踪。 通过clang、gcc的相关编译选项保证malloc、free位置的堆栈信息完整,通过堆栈信息对malloc、free的位置进行标记并尝试配对malloc、free;
2、为幸运的到来不断努力 对于服务器型程序通过一组YCY之力API函数,实现在线的重复内存检测的植入:
void YCY_power_start();
void YCY_power_finish();
int process(const Request& req, Response& resp) //the process function of your server
{
YCY_power_start(); //enable YCY mem record
/* your processing code */
YCY_power_finish(); //req processing finish, all malloced mem should be freed here
}
对于普通的程序,直接重复执行
#!/bin/bash
#script file ycy
#usage:ycy <your_exe> <your_args>
basepath=$(cd
dirname $0; pwd)
export LD_PRELOAD=$basepath/libycy.so #通过LD_PRELOAD实现hook注入和API函数植入
EXE=$1
for varible1 in {1..100000}
do
$EXE ${@:2}
done
假设世界上真的存在YCY之力,那么被检测代码经过足够多次的重复执行之后,真正存在内存泄漏的位置应该都会被记录下来。对总体内存泄漏很小的地方可以直接阈值过滤,再通过疑似泄漏的频繁度检测,最终找出最有可能内存泄漏的malloc、free模式
3、使用内存也是要付出代价 对于所有记录下来的内存泄漏位置,尝试匹配其malloc调用对应的free调用位置 对于malloc和对应free缺失类型的内存泄漏,直接在YCY_power_finish() API函数当中强行按地址free掉; 对于malloc长度和free长度不匹配的内存类型,强行按照malloc时的实际长度进行free掉; 在这个“付出代价”的强制修复之后,假如你的程序可以继续往下执行而没有崩溃(coredump),那么就说明你的程序被YCY之力成功保护了,此时可以通过
void YCY_power_export()
导出你程序当中所有被YCY所祝福的过的地方,再自行进行修改。如果崩溃了,就通过:
void YCY_power_reload()
重新恢复上次的检测结果,并在上次错误修改的基础上二分,直到有一个修复不会崩溃
可行性
可以在现成的clang、gcc的address-sanitizer或者gperf heap-profiler的基础上实现上述的检测模式(比较推荐address-sanitizer的lock-free实现) 预计2~3周时间可以实现一个toy或者demo版的模型
技能需求
知道本文到底在扯些什么神经病玩意。。。知道C++/C怎么写 (PS. 如果你真的看懂了本文到底在鬼扯什么,并且有兴趣一起实现这个工具,欢迎通过git与我联系。 这里有一个来自BAT的内推机会在等着你: 金瓜hr姐姐说今年就这一轮实习生招聘,不搞宣讲了!别佛了!今年就这一轮实习生招聘了!说好的给hr姐姐一片简历海呢! 你忍心看我们继续被同行嘲笑虎逼公司吗?!一年了!我们被隔壁公司挖了多少人!做不到线上线下笔试面试人头断层吊打,我们公司就要糊了!)