【翻译】heap-checking using tcmalloc

前一阵子在项目中使用tcmalloc的heap-checker查找内存泄露的问题,今天翻译一下官方文档的一篇heap-checker相关的文章,由于时间有限,没有完全翻译完,只翻译了比较重要的部分,后续将会补全。

在Google,我们使用heap checker检查C++程序的内存泄露。使用heap checker分三步:将lib库链接到应用中;运行代码;分析输出结果。

链接tcmalloc

heap-checker是tcmalloc的一部分,为了在应用程序中安装heap checker,在程序链接阶段需要加入-ltcmalloc。但上面这种方法并不是唯一的方式,我们可以使用LD_PRELOAD宏在程序运行时加入tcmalloc:

% env LD_PRELOAD="/usr/lib/libtcmalloc.so"

上面这种方式并没有打开heap checking;仅仅将代码插入到程序中。因此,在开发阶段我们建议使用链接tcmalloc库的方法,这也是我们在Google使用的方法(然而,我们也可以使用环境变量开启profiler,因此通过链接tcmalloc库并不是必须的。)。需要注意的是为了使用heap checker必须使用tcmalloc内存分配库。

运行代码

注意:由于一些安全原因,对于setuid程序,heap profiler在使用的过程中并不会写文件。

对整个程序进行内存泄露检查

我们推荐使用heap-checker的方式是“全程序”模式。在这种模式下,heap-checker在main()函数开始之前跟踪内存分配,在程序介绍的时候再次检查。如果发现有内存泄露(任何已经分配的内存在程序结束的时候并没有对象引用它们),程序将会中断(通过exit(1))并且打印怎样跟踪内存泄露的信息(使用pprof)

heap-checker会记录每一次内存分配的调用栈,因此开启heap-checker会导致程序的内存增长并影响程序的性能。

下面介绍怎么开启全程序模式的内存泄露检查:

  1. 定义环境变量 HEAPCHECK 声明内存泄露检查的模式。例如下面的方式:

    % env HEAPCHECK=normal /usr/local/bin/my_binary_compiled_with_tcmalloc

没有其他的操作了。

需要注意的是heap-checker使用heap-profiling的架构,因此不可能同时运行heap-checker和heap-profiler。

内存检查的特性

如下是在使用全程序内存检查的合法变量:

  1. minimal
  2. normal
  3. strict
  4. draconian

“minimal”的模式开始内存泄露检查尽可能晚,意味着你可以在初始化例程存在一些内存泄露(在main()函数前),但并不会让heap-checker记录。如果你在全局初始化时候存在内存泄露,“minimal”模式就很适合。否则,你应该使用更加严格的模式。

“normal”模式跟踪存活对象(live objects)并报告其内存泄露信息(在程序结束时,无法通过存活对象找到的内存空间都是内存泄露)

“strict”模式与“normal”模式很相似,但“strict”模式会监控全局变量析构函数的内存泄露。例如,如果你有一个全局变量,在运行时申请了部分内存,在析构函数中忘记释放内存,在“strict”模式下将会被监控到,在“normal”模式下将不会。

“draconian”模式适合想清晰了解应用程序内存管理的情况,其希望heap-checker去帮助他们优化内存管理。在“draconian”模式,heap-checker并不会只检查存活对象,只要有内存泄露,其都会报告。

“normal”模式是最常用的模式。

as-is”是一个更加灵活的模式;它允许你自定义heap-checker的一些特性。“local”激活“显式heap-check指令”,但并不会开启任何全程序内存泄露检查。

用于调试内存泄露的小方法

工作原理

当一个HeapLeakChecker对象被构造的时候,它会在tmp文件夹输出一个名为<prefix>.<name>-beg.heap的记录内存使用信息的文件。当NoLeak()被调用的时候(对于全程序检查,其发生在程序结束),它将输出一个名为<prefix>.<name>-end.heap的文件(<prefix>是自动诊断的,<name>是argv[0]的内容)。heap-checker将会对比这两个文件。如果第二个文件使用了过多的内存使用量,NoLeaks()函数将会返回false。对于全程序,这种情况将会引起程序中断。所有情况下都将会打印如何处理dump文件的信息。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,008评论 25 707
  • java 接口的意义-百度 规范、扩展、回调 抽象类的意义-乐视 为其子类提供一个公共的类型封装子类中得重复内容定...
    交流电1582阅读 2,220评论 0 11
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,612评论 18 399
  • 柏影从来没有这么狼狈过,一头长发黏在布满汗水血痕的脸上。他一直是一个很差劲的人,杀掉自己的师父,染上乳石散,虽在兴...
    agna阅读 673评论 0 0