使用TCmalloc的堆栈检查

使用TCMalloc的堆栈检查

  • Author:Echo Chen(陈斌)
  • Email:[email protected]
  • Blog:Blog.csdn.net/chen19870707
  • Date:October 15th, 2014

    在前一篇译文《TCMalloc:线程缓冲的Malloc》详细讲解了TCMalloc的工作原理和特点,今天翻译《heap-checking using tcmalloc》,了解Tcmalloc堆栈检查。

    一、自动的内存泄漏检查

    这篇技术文档描述了如何使用C++程序来检查堆栈。这种能力对于自动的内存泄漏检测非常有用。

    1.链接堆栈检查器

    你可以对任何链接了tcmalloc的程序进行堆栈检查,并且不需要重新编译。

    为了抓住所有的内存泄漏,tcmalloc必须被链接到你的可执行程序中。堆栈检查器可能误解列在它后面的链接库的一些内存。例如,它可能把这些库的内存误报为内存泄漏,而实际上并没有。

    把tcmalloc链接到你的程序,即时你不想使用堆栈检查器来检查也是安全的。你的程序并不会运行的有任何一点缓慢,因为你没有用到任何一点堆栈检查的特性。

    你可以通过LD_PRELOAD在那些不是你编译的程序中运行堆栈检查。

       1: $ LD_PRELOAD="/usr/lib/libtcmalloc.so" HEAPCHECK=normal 

    我们不建议这种使用。

    2.开启堆栈检查

    对可执行程序启动内存检查有两种方法:

    • 对于整个程序的堆栈检查,定义环境变量 HEAPCHECK为你需要的堆栈检查的类型:普通的、严格的或者苛刻的。例如: 对/bin/ls的内存检查:
       1: $ HEAPCHECK=normal /bin/ls
       2: % setenv HEAPCHECK normal; /bin/ls   # csh
    • 对程序的部分代码进行堆栈检查,你需要修改你的代码。用HeapLeakChecker对象把要检查的代码部分包起来,在你需要检查程序的末尾调用check.NoLeaks()。这将只对包含的代码区内的代码做内存检查。设置本地环境变量HEAPCHECK 来打开堆栈检查。

    下面是第二种用法的一个例子。如果Foo泄漏任何内存,下面代码就会终止。

       2: Foo();
       3: assert(checker.NoLeaks());

    当检查器对象一分配,它就会创建一个堆栈数据文件。当checker.NoLeaks()结束,它会创建另一个堆栈数据文件,然后进行比较产生一个新的数据文件。如果这个新的数据文件显示有内存增长,NoLeaks()将返回假并且把程序终止。关于如何使用pprof命令来获取一个详细的内存泄漏分析的提示信息会被打印出来。

    注意:pthread处理但钱并不完整。如果在构造或者内存检查的使其有phtread线程活跃,堆栈检查将错误的把它当作内存泄漏,对于全局堆栈检查的一个办法是 确保除了主线程外的所有现场都推出了在程序结束的时候。

    3.关闭已知的内存泄漏

    有时候你的程序有一些你已经知道并且接受的内存泄漏,你希望当你检查程序时,堆栈检查器忽略它们,你可以通过合适的堆栈检查对象来实现这个需求

       1: #include 
       2: ...
       3: void *mark = HeapLeakChecker::GetDisableChecksStart();
       4: <leaky code>
       5: HeapLeakChecker::DisableChecksToHereFrom(mark);

    -

    Echo Chen:Blog.csdn.net/chen19870707

    -

  • 时间: 2024-08-24 07:55:34

    使用TCmalloc的堆栈检查的相关文章

    使用Tcmalloc进行堆栈分析

    在前一篇译文<使用TCmalloc的堆栈检查>,介绍了Tcmalloc进行堆栈检查,今天翻译<heap-profiling using tcmalloc>,了解如何 TCmalloc进行堆栈分析. 一.堆栈分析的用法: 这篇技术文档描述了如何使用C++程序来分析堆栈.可以用来做一下三条事情: 在任何时间了解程序的堆栈情况 定位内存泄漏 找到大量内存分配的位置 1.链接堆栈分析器 你可以对任何链接了tcmalloc的程序进行堆栈分析,并且不需要重新编译. 把tcmalloc链接到你的

    TCMalloc 安装和使用

    Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:October 20th, 2014 前面三篇译文<TCMalloc:线程缓冲的Malloc>.<使用TCMalloc的堆栈检查>.<使用TCMalloc进行堆栈分析>介绍了TCMalloc的基本原理,以及堆栈分析和检查工具,TCMalloc优点很多,比glibc 2.3的malloc快.自带的堆栈工具可以轻

    记一次tcmalloc分配内存引起的coredump

    现象 线上的服务出现coredump,堆栈为: #0 0x000000000045d145 in GetStackTrace(void**, int, int) () #1 0x000000000045ec22 in tcmalloc::PageHeap::GrowHeap(unsigned long) () #2 0x000000000045eeb3 in tcmalloc::PageHeap::New(unsigned long) () #3 0x0000000000459ee8 in tc

    JNI之——在cmd命令行下编译执行C/C++源文件

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46604269 一直用java来敲代码,java配置好jre路径之后.在cmd下编译执行.非常方便. 刚好要给一个舍友改下C程序,想到可不能够像java一样在环境变量里配置好C的编译路径呢? 于是上网搜了一下,得到例如以下结果: 一.假设装有VC,那就简单了,由于VC带有C的编译器,能够将此路径设置进环境变量. Windows系统下编译连接源码方法: cl -GX test.c -

    VC编译连接选项详解(转)

    大家可能一直在用VC开发软件,但是对于这个编译器却未必很了解.原因是多方面的.大多数情况下,我们只停留在“使用”它,而不会想去“了解”它.因为它只是一个工具,我们宁可把更多的精力放在C++语言和软件设计上.我们习惯于这样一种“模式”:建立一个项目,然后写代码,然后编译,反反复复调试.但是,所谓:“公欲善其事,必先利其器”.如果我们精于VC开发环境,我们是不是能够做得更加游刃有余呢? VC的处理流程,大致分为两步:编译和连接.源文件通过编译生成了.obj文件:所有.obj文件和.lib文件通过连接

    php之道

    PHP The Right Way. Tweet 欢迎 目前网络上充斥着大量的过时资讯,让 PHP 新手误入歧途,并且传播着错误的实践以及不安全的代码.PHP 之道 收集了现有的 PHP 最佳实践.编码规范和权威学习指南,方便 PHP 开发者阅读和查找 使用 PHP 沒有规范化的方式.本网站主要是向 PHP 新手介绍一些他们没有发现或者是太晚发现的主题, 或是经验丰富的专业人士已经实践已久的做法提供一些新想法.本网站也不会告诉您应该使用什么样的工具,而是提供多种选择的建议,并尽可能地说明方法及用

    介绍Visual Studio的Android模拟器

    http://blogs.msdn.com/b/visualstudioalm/archive/2014/11/12/introducing-visual-studio-s-emulator-for-android.aspx 微软发布了Visual Studio 2015预览这一周和你现在有选择为Android开发:c++,科尔多瓦,c# Xamarin的. 选择其中一个Android开发选项时,Visual Studio还将安装全新的Visual Studio Android模拟器调试应用程序

    Pascal数据结构与算法

    第一章 数据结构与算法的引入 1.1 数据结构的基本概念 一. 学习数据结构的意义 程序设计 = 数据结构 + 算法 目前,80%的待处理的数据具有“算法简单”(四则运算.检索.排序等),“对象复杂”(数据类型不同.数据量大.需要保存)等特点,故合理组织数据.选择较好的数据结构可为高效算法(时间少.占用空间小)提供理想的对象. 二.基本术语 1.数据(data): 是对客观事物的符号的表示,是所有能输入到计算机中并被计算机程序处理的符号的总称.(P1表1-1中,学号.姓名.性别.民族等列为字符型

    linux下valgrind的使用概述

    Valgrind简介: Valgrind是动态分析工具的框架.有很多Valgrind工具可以自动的检测许多内存管理和多进程/线程的bugs,在细节上剖析你的程序.你也可以利用Valgrind框架来实现自己的工具. Valgrind通常包括6个工具:一个内存错误侦测工具,两个线程错误侦测工具,cache和分支预测的分析工具,堆的分析工具. Valgrind的使用与CPU OS以及编译器和C库都有关系.目前支持下面的平台: - x86/Linux - AMD64/Linux - PPC32/Linu