linux背后隐藏着各种各种丰富的宝藏,找到这些工具,学会这些工具,让这些工具更好地服务于我们的项目开发,不仅可以提高工作的效率,而且可以增强个人技术力。所以围绕在MK1阶段和MK23阶段,有哪些工具可以辅助我们的工作,我们展开了此次技术调查。

[应用范围]
MK1阶段和MK23阶段的内存检测

[正文]

对比:

mtrace: 不需要安装,使用时包含一个头文件,程序中在需要的调用mtrace和muntrace方法即可

memwatch: 在需要检测的.c文件里面包含memwatch.h文件,编译的时候加上几个参数即可

splint:需要下载源码并安装程序,通过标志和注释来获取想要的错误信息

valgrind:提供不同的工具来实现不同功能的检测,需要编译源码

使用:

一. mtrace使用方法:

mtrace只能检测malloc,realloc和free引发的错误。

用法如下:

1. 定义宏export MALLOC_TRACE=<malloc_trace_filename>

例如:MALLOC_TRACE=mlog.txt

如果不定义宏或者不能定义宏,使用setenv函数,下面是setenv函数原型:

#include <stdlib.h>

--int setenv(const char *name, const char *value, int overwrite)

该函数是用来添加或者改变一个环境变量,name是变量名,value是值,如果变量已经存在并且overwrite为0,不改变变量值,如果overwrite不为0,则使用环境变量的新值覆盖旧值。

一个使用的例子:setenv("MALLOC_TRACE", "mlog.txt", 1);

2. 在.c文件中引用#include <mcheck.h>

3. 在开始申请内存之前,调用mtrace();

4. 执行编译后生成的可执行文件,如果程序结束,对于生成的mlog.txt,使用mtrace mlog.txt 或者 mtrace <可执行文件> mlog.txt

5. 如果程序会一直运行,在程序适当的地方调用muntrace函数,就会生成log文件

如果对一块内存free多次,程序运行被打断,终端打印出错误。

一个简单的例子:

#include <stdio.h>

#include <mcheck.h>

#include <stdlib.h>

int main()

{

setenv("MALLOC_TRACE", "mlog.txt", 1);

char *p;

mtrace();

p = (char *)malloc(4);

p = (char *)malloc(5);

while( 1 )

{

sleep(4);

muntrace();

}

return 0;

}

二. memwatch使用方法:

memwatch可以检测:未释放的内存,同一段内存被释放多次和使用未分配内存区域,溢出和下溢等错误;

右边是使用memwatch要用到的源码。

步骤:

  1. 确保被测工程中有memwatch.c何memwatch.h文件,

  1. 源码中每个.c文件中都include头文件memwatch.h,

  1. 编译代码,gcc后添加-DMEMWATCH 和 -DMW_STDIO(或者-DMEMWATCH_STDIO),还有memwatch.c文件,

  1. 运行生成的可执行文件,程序运行结束后,生成的log文件名为memwatch.log,如果未生成上述文件,则会写入memwatNN.log文件,NN为01~99,如果还未成功,则放弃写log文件。

注:memwatch会使系统速度减慢

三. splint使用:

splint是静态代码检测工具,可以检查包括:

Null Dereferences:针对空指针

Undefined Values:未初始化数据

Types:转化类型不一致

Memory Management:内存管理检测,如内存泄露

sharing:共享存储空间安全性检测

Function Interfaces:函数接口检测(参数传递等)

Control Flow:函数执行分支检测

Buffer Sizes:缓冲区边界检查

Completeness:完整性检查,包括未使用变量、函数等

还有Macros(宏隐患检测等)

还有其他的应用。

源码包安装:

#tar zxvf splint-3.1.2.src.tgz

#cd splint-3.1.2

#mkdir /usr/local/splint

#./configure --prefix=/usr/local/splint

#make

#make install

#vi ~/.bashrc    (或者 sudo gedit ~/.bashrc) ~目录是/root

添加:

export LARCH_PATH=/usr/local/splint/share/splint/lib

export LCLIMPORTDIR=/usr/local/splint/share/splint/import

#source ~/.bashrc

#export PATH=/usr/local/splint/bin/splint:$PATH

到此,splint源码安装完成。

splint提供了三种方式进行检查的控制,分别是flags标志、 .splintrc配置文件和格式化注释。

flags: splint支持几百个标志用来控制检查和消息报告,使用时标志前加‘+’或‘-’,‘+’标志开启这个标志,‘-’表示关闭此标志。下面例子展示了flags标志的用法:

splint -showcol a.c //在检测a.c时,告警消息中列数不被打印

splint -varuse a.c //在检测a.c时,告警消息中未使用变量告警不被打印

.splintrc配置文件: .splintrc文件中对一些flags做了默认的设定,命令行中指定的flags会覆盖.splintrc文件中的标志。

格式化注释:格式化注释提供一个类型、变量或函数的额外的信息,可以控制标志设置,增加检查效果。所有格式化注释都以/*@开始,@*/结束,比如在函数参数前加/*@null@*/,表示该参数可能是NULL,做检测时,splint会加强对该参数的值的检测。

四. valgrind使用:

步骤:

1:tar -xf valgrind-3.9.0.tar.bz2

2:./configure

3:make

4:make install(如果失败,改用root权限)

5:valgrind ls -l(检查是否正常工作,如果出错,按照提示安装相应文件)

下面的工具是valgrind安装时的标准配置:

Memcheck:用于检测内存错误。它帮助c和c++的程序更正确。

Cachegrind:用于分析cache和分支预测。它帮助程序执行得更快。

Callgrind:用于函数调用的分析。

Helgrind:用于分析多线程。

DRD:也用于分析多线程。与Helgrind类似,但是用不同的分析技术,所以可以检测不同的问题。

Massif:用于分析堆。它帮助程序精简内存的使用。

SGcheck:检测栈和全局数组溢出的实验性工具,它和Memcheck互补使用。

--leak-check=yes打开内存泄露检测细节

--tool=helgrind使用Helgrind工具检测线程错误

假设hello是可执行程序:可能的使用方法如下

valgrind --leak-check=yes ./hello

或者valgrind ./hello

终端上显示检测信息。

Linux之内存泄露的检测工具相关推荐

  1. 内存泄露部分检测工具

    1.ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库. 2.Dmalloc-Debug Malloc Library. 3.Electric Fe ...

  2. linux 进程内存分析工具,Linux内存使用情况以及内存泄露分析之工具与方法

    1. 内存使用情况分析 1.1 系统总内存分析 通过cat /proc/meminfo,可用的物理内存=MemFree+Buffers+Cached. MemTotal:        5933132 ...

  3. linux c 内存泄露 检查工具

    Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++.最近用到STL中的List编程,为了检测写的代码是否会发现内存泄漏,了解了一下相关的知识. 所有使用动态内存分配(dy ...

  4. linux注入内存泄露,Linux 内存泄露小结

    本文仅限记录自己的一次 内存泄露追踪小记. 可能并不十分适用与大家的情况.而且方法也并不是很smart.仅做记录,能提供个思路更好. 一. 要问调试程序遇到什么问题最头疼, 内存泄露肯定能排在前几名里 ...

  5. C++ 内存泄露和检测

    C++ 中的内存泄露一般指堆中的内存泄露.堆内存是我们手动 malloc/realloc/new 申请的,程序不会自动回收,需要调用 free 或 delete 手动释放,否则就会造成内存泄露.内存泄 ...

  6. Unix/Linux提权漏洞快速检测工具unix-privesc-check

    Unix/Linux提权漏洞快速检测工具unix-privesc-check unix-privesc-check是Kali Linux自带的一款提权漏洞检测工具.它是一个Shell文件,可以检测所在 ...

  7. 介绍linux上两种rootkits检测工具: Rootkit Hunter和Chkrootkit

    原贴:http://blog.csdn.net/linkboy2004/archive/2007/03/22/1537890.aspx 介绍linux上两种rootkits检测工具: Rootkit ...

  8. Linux之turbostat超频检测工具(一百零二)

    Linux之turbostat超频检测工具 turbostat为Intel提供的超频检测工具,可以真正在Linux下获取睿频频率的工具. 由下可知:物理cpu个数为6,核心数为12,支持超线程,逻辑c ...

  9. Linux下内存泄露工具

    概述 内存泄露(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,这时就出现了内存泄露.尽管优秀的编程实践可以确保最少的泄露,但是根据经验, ...

最新文章

  1. Facebook参与AI芯片设计大混战!
  2. get传递中文产生乱码的解决方式汇总
  3. 人脸识别数据集bin解压
  4. undertow服务器分析_使用undertow构建和测试Websocket服务器
  5. 【vue系列之二】详解vue-cli 2.0配置文件
  6. 查询前10条_98条铁路!2021年底前计划开工建设铁路进度一览(10月8日更新)
  7. android 第三方框架
  8. linux提升nvme性能,基于SPDK的NVMe SSD性能评估指南
  9. K-Lite Codec Pack 解码器下载及安装过程步骤参考
  10. 谈谈 SAP 系统的权限管控和事务记录功能的实现
  11. Python题库编程记录
  12. ie浏览器不支持java_用于解决IE浏览器中Java脚本无法执行
  13. Hi3559移植OpenCV3.3
  14. 苍松翠柏,自然景色非常优美
  15. 一篇13年前的采访|庚顿首席科学家孙宝元:从数据融合起步,瞄准创造价值,打造助力智能化生产的利器
  16. 18. Redis 管理命令-查看服务器状态
  17. 三点运算符(...)的使用
  18. STM32+PN532写UltraLight标签
  19. 用几段代码搞定Java文件流
  20. daily CodeWars

热门文章

  1. (15.1.5)无聊的时候我们就去翻妹子们的微博
  2. Pixlr.com:最流行的免费 Web 版照片编辑工具
  3. 图片如何直接编辑?快来试试这款图片在线处理工具
  4. 银行家算法(文件读入输出)
  5. Photoshop常用快捷键(中英参照)
  6. LBM学习及流体计算开源包问题解答
  7. 最新导则下生态环评报告编制技术(报告篇、制图篇、指数篇、综合应用)
  8. centos7修改mysql初始密码
  9. 幻兽养成方案!我的宝宝我做主
  10. iOS 调用设备震动