CPP内存检测

摘要:
对C、C++的内存泄露、内存溢出等检查,经过这两天的查资料,总体来说可以使用Valgrind,AddressSanitizer,Dr.Memory等。而对于Android上的使用,Google目前则大力推荐使用AddressSanitizer来替代Valgrind.Dr.Memory使用IBMdeveloper一个较好的caseValgrind使用参考参考2Valgrind包含下列工具:memcheck:检查程序中的内存问题,如泄漏、越界、非法指针等。比如g++-g-otestValgrindtestValgrind.cpp使用Valgrind来检测,valgrind--tool=memcheck--leak-check=full./testValgrindAddressSanitizer这是谷歌目前极力推荐在Android中使用的内存检测工具。VisualStudio检测如果使用VisualStudio,则有更为简单的方法做一内存泄露检测,但也只能检测内存泄露。

对C、C++的内存泄露、内存溢出等检查,经过这两天的查资料,总体来说可以使用Valgrind, AddressSanitizer, Dr.Memory等。其中Valgrind对程序运行速度影响较大,运行耗时10倍以上,如果是对Android Native代码进行检查,比较推荐对代码进行必要的修改,编译成可执行文件,在pc Linux系统上检测是否存在内存问题。Dr.Memory则比Valgrind的速度快,比较适合在Windows系统中使用。而对于Android上的使用,Google目前则大力推荐使用AddressSanitizer来替代Valgrind.

Dr.Memory使用

IBM developer一个较好的case

Valgrind使用

参考
参考2
Valgrind包含下列工具:

  1. memcheck:检查程序中的内存问题,如泄漏、越界、非法指针等。
  2. callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能。
  3. cachegrind:分析CPU的cache命中率、丢失率,用于进行代码优化。
  4. helgrind:用于检查多线程程序的竞态条件。
  5. massif:堆栈分析器,指示程序中使用了多少堆内存等信息。
  6. lackey:
  7. nulgrind:
    这几个工具的使用是通过命令:valgrand --tool=name 程序名来分别调用的,当不指定tool参数时默认是 --tool=memcheck.

使用:

  1. 在Ubuntu中下载安装Valgrind,sudo apt install valgrind
  2. 把要检测的代码编译成可执行文件,注意编译的时候要带上-g编译命令。比如g++ -g -o testValgrind testValgrind.cpp
  3. 使用Valgrind来检测,valgrind --tool=memcheck --leak-check=full ./testValgrind

AddressSanitizer

这是谷歌目前极力推荐在Android中使用的内存检测工具

VisualStudio检测

如果使用VisualStudio,则有更为简单的方法做一内存泄露检测,但也只能检测内存泄露。代码如下,[参考](c++怎么检测内存泄露,怎么定位内存泄露? - Chen Moore的回答 - 知乎
https://www.zhihu.com/question/63946754/answer/214793614):

/*
 * 1:在每个cpp文件中包含base.h头文件,当然直接把base.h的内容复制到cpp中也可以
 * 2:在程序退出的时候调用_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF);
 * 3:在VS的debug模式下
 */
#include "base.h"
#include "stdafx.h"
#include <iostream>

int main()
{
    int *a = new int[8];
    int *b = (int *)malloc(8 * 7);
    a[0] = 5;
    a[9] = 99;
    std::cout << a[0];

    _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF);
    return 0;
}

/*
//base.h内容
#ifdef _WIN32
#include <crtdbg.h>
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#endif

#ifdef _WIN32
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
#endif
*/

免责声明:文章转载自《CPP内存检测》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇wireshark抓包看ECNjava生成解析xml的另外两种方法JAXB下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Valgrind使用说明

原文地址: Valgrind使用说明     Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,是公认的最接近Purify的产品,它包含一个内核——一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务——调试,分析,或测试等。Valgrind可以检测内存泄漏和内存越界,还可以分析cache的使用等,灵活轻巧而又强大。...

FFMPEG 配置选项详细说明

转自:https://blog.csdn.net/z2066411585/article/details/81239446 用法:配置[选项] 选项:[描述后括号中的默认值] 帮助选项: --help 打印此消息 --quiet 抑制显示信息输出 --list-decoders 显示所有可用的解码器 --list-encoders 显示所有可用的编码器 -...

使用valgrind检查内存

  Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,是公认的最接近Purify的产品,它包含一个内核——一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务——调试,分析,或测试等。Valgrind可以检测内存泄漏和内存越界,还可以分析cache的使用等,灵活轻巧而又强大。     1.Valgrind概观Valgr...

[转]Windows上的valgrinddeleaker

Valgrindis a developer tool for C++ developers used to find memory issues including C++ memory leak detection. Valgrind uses instrumentation to collect information about allocated...

Ubuntu上交叉编译valgrind for Android 4.0.4的过程与注意事项

编译环境:Ubuntu x86_64(Linux root 2.6.32-45-generic #101-Ubuntu SMP Mon Dec 3 15:39:38 UTC 2012 x86_64 GNU/Linux) 运行环境:Android 4.0.4 (Linux kernel 3.0.21 OMAP4460) 一、下载NDK9和valgrind...

定位多线程内存越界问题实践总结

最近定位了在一个多线程服务器程序(OceanBase MergeServer)中,一个线程非法篡改另一个线程的内存而导致程序core掉的问题。定位这个问 题花了整整一周的时间,期间历经曲折,尝试了各种内存调试的办法。往往感觉就要柳暗花明了,却发现又进入了另一个死胡同。最后,使用 强大的mprotect+backtrace+libsigsegv等工具成...