ccyyycy / ycy

"Hello YCY" Programming Competition
1.99k stars 162 forks source link

【内存泄漏检查工具】+【锦鲤】+【clang/gcc Linux】+【目前单干】+【QQ:375595294】 #359

Open eraser0 opened 5 years ago

eraser0 commented 5 years ago

背景

近来有部分程序员不努力提高自身技术水平,妄图通过拜超越保证自己服务器的稳定运营: image 对此,我们正统村民程序员对这样的不相信科学的行为表示鄙视: image 为了在程序员当中正确推广杨超越这一形象的影响力,我们决定开发一款帮助程序员利用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=$(cddirname $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姐姐一片简历海呢! 你忍心看我们继续被同行嘲笑虎逼公司吗?!一年了!我们被隔壁公司挖了多少人!做不到线上线下笔试面试人头断层吊打,我们公司就要糊了!)

kele1997 commented 5 years ago

虽然有兴趣,但看不懂😅

flowercodec commented 5 years ago

全部能看懂,并且有兴趣

power721 commented 5 years ago

然后用实现的程序来保护本程序不会内存泄漏

immarktube commented 5 years ago

完全看不懂...

MrByte-hk commented 5 years ago

def odd(): print( ' step 1' ) yield( 1 ) print( 'step' ) yield( 3 )

nullcanon commented 5 years ago

能看懂并且有兴趣,大佬带我!