精华内容
下载资源
问答
  • Windows内存泄漏检测工具总结

    千次阅读 2018-03-26 00:02:24
    Windows内存泄漏检测工具总结 前言 Win32内存管理结构 Windows内存泄漏检测工具简单原理 Windows内存泄漏检测工具总结 前言 做C\C++开发的时候,经常会有程序内存(资源)泄漏的Bug。对于这类Bug,除了提高...

    Windows内存泄漏检测工具总结



    前言

    做C\C++开发的时候,经常会有程序内存(资源)泄漏的Bug。对于这类Bug,除了提高代码质量(比如使用智能指针),我们也可以借助一些调试工具来帮助我们定位问题。
    Windows平台下还是有很多的内存泄漏检测工具的,这里我自己总结一下使用过的免费工具(基本上是开源的)。
    



    Win32内存管理结构

    Win32内存管理可以分为三层。VM,Win32 Heap, CRT Heap。在我们一般的编程过程中,使用的是CRT Heap(malloc,free,new,delete)
    这里写图片描述



    Windows内存泄漏检测工具简单原理

    这里我简单描述自己了解的一种实现原理,只是一种可行的方法

     1. 远程注入DLL到目标进程(VLD是需要目标进程链接DLL的),关键部分就是这个DLL中的逻辑

     2. 当DLL被加载目标进程的时候,HOOK内存分配释放函数。当程序分配内存的时候,记录下这次分配的信息(分配的位置,大小,调用堆栈等)到一个map中,当程序释放内存的时候,就从map中移除。

     3. 在进程退出或者某个时候,可以遍历map,打印出还没有被释放的内存块的信息。

    上面只是一个简单的描述,具体的话涉及的问题还比较多,当然资料也很多。

    远程注入:关键点CreateRemoteThread
    HOOK:HOOK有现成库detours,minihook等
    调用堆栈:可以使用DbgHelp相关的函数来加载pdb,解析堆栈StackWalk64



    Windows内存泄漏检测工具总结

    • Leak Mon

      • 这个是CodeProject上的一个开源工具,远程注入不需要修改代码
    • VLD

      • 这个工具使用的时候需要修改源代码
    • UMDH

      • 这个工具是MS提供的检测用户模式的内存泄露问题,使用起来稍微有点麻烦,需要对目标进程抓取两份log,然后比较
      • gflags /i ImageName +ust (create user mode stack trace)
      • umdh -p:124 -f:log1.txt
      • umdh -p:124 -f:log2.txt
      • umdh log1.txt log2.txt > logcompare.txt
    • Dr.Memory

      • 这个工具是基于动态二进制插桩工具DynamoRIO开发的,检测原理不一样。并且能够检测到更多的错误(比如读取未初始化的内存,访问越界等),但我感觉对程序性能影响很大
    • CRT

      • VC++的CRT库在Debug下支持内存的诊断的,我们在调试程序,进程退出的时候看到”Detected memory leaks! Dumping objects -> “就说明有内存没有正确的释放,当时看不到代码行号。
      • #define _CRTDBG_MAP_ALLOC 定义_CRTDBG_MAP_ALLOC宏,能使得CRT库打印行号。
      • 同时CRT库提供丰富的API来支持调试,包括HOOK分配和释放函数。
    • Debug Dialog, Leak Diag.

    展开全文
  • windows内存检测工具

    千次阅读 2019-05-28 16:22:24
    1、Intel的Parallel Inspector工具,和vs集成超好, 而且还带了线程检测工具. 2、Purify 3、CodeGuard 4、MemCheck 5、Valgrind 6、Insure++

    1、Intel的Parallel Inspector工具,和vs集成超好, 而且还带了线程检测工具.

    2、Purify
    https://www.cnblogs.com/hehehaha/archive/2013/04/10/6332923.html

    3、Valgrind

    4、Insure++
    https://blog.csdn.net/liubang200707/article/details/8258676

    5、Leakdiag
    https://blog.csdn.net/jianjian1992/article/details/51458527

    6、CodeGuard
    http://www.doc88.com/p-3307851197169.html

    7、pclint

    内存泄漏工具检测合集(25款):
    https://www.cnblogs.com/findumars/p/5353538.html

    常见的各个平台下面的内存检查工具或者插件:
    https://blog.csdn.net/jasonzeng/article/details/49097475

    https://blog.csdn.net/pzhw520hchy/article/details/81713242

    展开全文
  • windows xp vc 内存检测工具 Visual Leak Detector 还挺好用的,方便。

      windows xp vc 内存检测工具 Visual Leak Detector  还挺好用的,方便。

    展开全文
  • 1 Linux内存泄漏检测工具ValgrindValgrind简介Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它...

     

    1 Linux内存泄漏检测工具Valgrind

     

     

     

    Valgrind简介

            Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。

    Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。

     

    Valgrind用法

    valgrind [options] prog-and-args [options]: 常用选项,适用于所有Valgrind工具。

    - tool=<name> 最常用的选项。运行 valgrind中名为toolname的工具。默认memcheck。
    h –help 显示帮助信息。
    -version 显示valgrind内核的版本,每个工具都有各自的版本。
    q –quiet 安静地运行,只打印错误信息。
    v –verbose 更详细的信息, 增加错误数统计。
    -trace-children=no|yes 跟踪子线程? [no]
    -track-fds=no|yes 跟踪打开的文件描述?[no]
    -time-stamp=no|yes 增加时间戳到LOG信息? [no]
    -log-fd=<number> 输出LOG到描述符文件 [2=stderr]
    -log-file=<file> 将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID
    -log-file-exactly=<file> 输出LOG信息到 file
    -log-file-qualifier=<VAR> 取得环境变量的值来做为输出信息的文件名。 [none]
    -log-socket=ipaddr:port 输出LOG到socket ,ipaddr:port
    LOG信息输出
    -xml=yes 将信息以xml格式输出,只有memcheck可用
    -num-callers=<number> show <number> callers in stack traces [12]
    -error-limit=no|yes 如果太多错误,则停止显示新错误? [yes]
    -error-exitcode=<number> 如果发现错误则返回错误代码 [0=disable]
    -db-attach=no|yes 当出现错误,valgrind会自动启动调试器gdb。[no]
    -db-command=<command> 启动调试器的命令行选项[gdb -nw %f %p]
    适用于Memcheck工具的相关选项:
    -leak-check=no|summary|full 要求对leak给出详细信息? [summary]
    -leak-resolution=low|med|high how much bt merging in leak check [low]
    -show-reachable=no|yes show reachable blocks in leak check? [no]

     

     

    安装valgrind

    azheng@ubuntu16:~/test$ sudo apt-get install valgrind

     

    测试代码

    azheng@ubuntu16:~/test$ cat testcode.c 

    #include <stdlib.h>
    
    int *fun()
    {
        int *p = malloc(10 * sizeof(int));
        p[10] =0 ;  //error 1
        return p;
    }
    
    int main()
    {
        int *ptr = NULL;
        ptr = fun();
        //free(c);  //error 2
        ptr = NULL;
        return 0;
    }


    编译:
    azheng@ubuntu16:~/gcc testcode.c -o main
    azheng@ubuntu16:~/test$ ls

    main  testcode.c

     

     

     

    valgrind使用

    azheng@ubuntu16:~/test$ valgrind --tool=memcheck  --leak-check=full ./main

     

    报告

    ==77673== Memcheck, a memory error detector
    ==77673== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
    ==77673== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
    ==77673== Command: ./main
    ==77673== 
    ==77673== Invalid write of size 4
    ==77673==    at 0x400544: fun (in /home/azheng/test/main)
    ==77673==    by 0x400566: main (in /home/azheng/test/main)
    ==77673==  Address 0x5204068 is 0 bytes after a block of size 40 alloc'd
    ==77673==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==77673==    by 0x400537: fun (in /home/azheng/test/main)
    ==77673==    by 0x400566: main (in /home/azheng/test/main)
    ==77673== 
    ==77673== 
    ==77673== HEAP SUMMARY:
    ==77673==     in use at exit: 40 bytes in 1 blocks
    ==77673==   total heap usage: 1 allocs, 0 frees, 40 bytes allocated
    ==77673== 
    ==77673== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
    ==77673==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==77673==    by 0x400537: fun (in /home/azheng/test/main)
    ==77673==    by 0x400566: main (in /home/azheng/test/main)
    ==77673== 
    ==77673== LEAK SUMMARY:
    ==77673==    definitely lost: 40 bytes in 1 blocks
    ==77673==    indirectly lost: 0 bytes in 0 blocks
    ==77673==      possibly lost: 0 bytes in 0 blocks
    ==77673==    still reachable: 0 bytes in 0 blocks
    ==77673==         suppressed: 0 bytes in 0 blocks
    ==77673== 
    ==77673== For counts of detected and suppressed errors, rerun with: -v
    ==77673== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

     

    重新修改代码后,进行内存检查

    azheng@ubuntu16:~/test$ valgrind --tool=memcheck  --leak-check=yes --show-reachable=yes ./main 
    ==77813== Memcheck, a memory error detector
    ==77813== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
    ==77813== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
    ==77813== Command: ./main
    ==77813== 
    ==77813== 
    ==77813== HEAP SUMMARY:
    ==77813==     in use at exit: 0 bytes in 0 blocks
    ==77813==   total heap usage: 1 allocs, 1 frees, 40 bytes allocated
    ==77813== 
    ==77813== All heap blocks were freed -- no leaks are possible
    ==77813== 
    ==77813== For counts of detected and suppressed errors, rerun with: -v
    ==77813== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

     

    说明

    Invalid write of size 4:表示数组越界写了4字节

    40 bytes in 1 blocks:表示因程序退出而发生内存泄露40字节

     

     

     

    2 Windows内存泄漏检测工具VLD

     

    Visual Leak Detector

    下载链接:https://vld.codeplex.com/releases


    在Visual C++ IDE的"工具"→"选项"→"项目和解决方案"→"VC++ 目录","包含文件"增加VLD的"\include"路径,"库文件"增加VLD的"\lib\Win32"路径,另外动态库"\bin\Win32"路径在安装时已经添加到环境变量里面了,若是未添加,则需要手动拷贝"\bin\Win32"下的文件到工程Debug目录。

    添加#include "vld.h"


     

    3 CppCheck

            Windows版本不好用,Linux还可以。

    4 Cpplint

     

    代码规范检查

    azheng@ubuntu16:~$ cat test/testcode.c 

    #include <stdlib.h>
    
    int *fun()
    {
        int *x = malloc(10 * sizeof(int));
        x[10] =0 ; //error
    }
    
    int main()
    {
        int *c = NULL;
        c = fun();
        return 0;
    }

     

    azheng@ubuntu16:~$ cppcheck test/testcode.c 

    Checking test/testcode.c...
    [test/testcode.c:5]: (error) Array 'x[10]' accessed at index 10, which is out of bounds.

    [test/testcode.c:6]: (error) Memory leak: x

     

    azheng@ubuntu16:~$ cpplint-1.3.0/cpplint.py test/testcode.c 
    test/testcode.c:0:  No copyright message found.  You should have a line: "Copyright [year] <Copyright Owner>"  [legal/copyright] [5]
    test/testcode.c:3:  { should almost always be at the end of the previous line  [whitespace/braces] [4]
    test/testcode.c:4:  Tab found; better to use spaces  [whitespace/tab] [1]
    test/testcode.c:5:  Tab found; better to use spaces  [whitespace/tab] [1]
    test/testcode.c:5:  At least two spaces is best between code and comments  [whitespace/comments] [2]
    test/testcode.c:5:  Should have a space between // and comment  [whitespace/comments] [4]
    test/testcode.c:5:  Missing spaces around =  [whitespace/operators] [4]
    test/testcode.c:5:  Extra space before last semicolon. If this should be an empty statement, use {} instead.  [whitespace/semicolon] [5]
    test/testcode.c:9:  { should almost always be at the end of the previous line  [whitespace/braces] [4]
    test/testcode.c:10:  Tab found; better to use spaces  [whitespace/tab] [1]
    test/testcode.c:11:  Tab found; better to use spaces  [whitespace/tab] [1]
    test/testcode.c:12:  Tab found; better to use spaces  [whitespace/tab] [1]
    Done processing test/testcode.c
    Total errors found: 12

     

     

     
    展开全文
  • Windows 内存泄漏检测工具——LeakDiag

    千次阅读 2009-02-02 10:38:00
    对于内存泄漏的检查,本质上在于定位内存泄漏。这种定位包含两层含义:一是定位模块,即哪个模块出了问题。二是定位代码,即找到造成内存泄漏的代码。对此,在分工合作完成一个系统的背景下,我们检查内存泄漏的工作...
  • 内存测试_内存检测工具大全

    千次阅读 2020-01-25 22:12:05
    测试内存,往往不局限于一种软件,因为每种工具都有自己的局限性。灵活运用多种工具,是为了实现最大的测试效果,提升产品质量 ...①它是当年少数可以在Windows操作系统中运行的内存检测软件之一(传统...
  • 今天玩吃鸡,突然很卡,奇了怪,我买的可是战神啊。...最后用Windows自带的内存检测工具,检测了一次,大概10-20分钟的样子,提示也没发现什么异常,但是检测完后自动重启就好了,可怕,我可能不是中毒了,是中邪了。
  • 内存检测工具比较

    千次阅读 2010-11-21 20:26:00
    内存检测工具比较
  • 对于内存泄漏的检查,本质上在于定位内存泄漏。这种定位包含两层含义: 一是定位模块,即哪个模块出了问题。 二是定位代码,即找到造成内存泄漏的代码。 对此,在分工合作完成一个系统的背景下,我们检查内存泄漏...
  • 内存检测工具

    2010-02-10 13:13:00
    目前,已经有许多内存检测工具可供我们选择,如MallocDebug,Valgrind,Kcachegrind,dmalloc,NuMega,BoundsCheck,ParaSoft ,Insure++,Rational的 Purify等等。Valgrind:Valgrind是x86架构Linux上的多重用途...
  • 命令行下面执行services.msc使用Windws内存诊断工具检查内存可靠性 mdsched.exehttp://www.startos.com/windows/win7/tips/2012013031841_2.html
  • VLD安装:https://kinddragon.github.io/vld/点击下载安装器,安装完成后,会自动将其include目录添加到VS的附加安装目录,将其静态库目录(lib目录)添加到...即可运行程序,退出后产生检测报告注意事项:如果有inclu...
  • 内存检测工具Dr. Memory的使用

    万次阅读 2016-06-10 11:47:07
    内存检测工具Dr. Memory的使用
  • 1.检测需要使用的工具:windbg工具检测前,需要先安装windbg工具。安装了该工具后,会在安装目录下有一个umdh工具。假设windbg安装在以下目录下:D:\Program Files\Debugging Tools for Windows (x86)2.内存泄露...
  • C++内存错误检测工具

    千次阅读 2017-12-24 14:09:45
    C++内存错误检测工具 简介 1)开发时,该如何尽力避免内存错误的发生; 2)开发后,该如何去确定真的没有问题; 相关内容 1)内存使用方式简介; 2)使用智能指针降低内存泄露的风险; 3)windows上,使用...
  • 本文主要记录 Windows内存泄漏检测工具;Linux 下首选必须是 Valgrind 啊。 目前待检测的程序采用的是 Qt,由于Qt本身的半自动内存管理机制,因此好用的检测工具真的不容易找…详细可看该篇 Qt浅谈之一:内存泄露...
  • 内存泄露检测工具

    2010-05-17 15:17:00
    浅谈C/C++内存泄露及其检测工具windows)http://c.chinaitlab.com/system/788396.htmlLinux C内存泄露检测工具http://blog.sina.com.cn/s/blog_4b9216f50100e6o7.html?retcode=0
  • 当程序越来越复杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题。内存泄漏是最常见的内存问题之一。内存泄漏如果不是很 严重,在短时间内对程序不会有太大的影响,这也使得内存泄漏问题有很强的隐蔽性...
  •  Windows7 32位系统  Visual Studio 2012 旗舰版  vld-2.2.3-setup.exe 大小1.04M 2 步骤  1)下载安装  下载好 vld-2.2.3-setup.exe(大小1.04M) 并安装,一路点击"确定"到安装完成, ...
  • 内存泄漏检测工具

    万次阅读 2011-11-02 14:11:51
    内存泄漏(memory leak),指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。在编程时进行动态内存分配是非常必要的,它可以在程序运行的过程中帮助分配所需的内存,而不是在进程启动的时候就进行分配。...
  • Windows/Linux下C/C++内存泄露检测工具

    千次阅读 2017-02-17 17:51:24
    一、Window下的内存泄露检测(以VC++环境为例) 灵活自由是C语言的一大特色,但这个特色也难以避免的带来一些副作用,比如内存泄露。众所周知,内存泄露的问题比较复杂,程序正常运行时你看不出它有任何异常,但长...
  • Visual Leak Detector, 用于VC,类似于Linux下面的Valgrind,可以很方便的定位内存泄露具体位置。 下载地址:http://www.codeproject.com/tools/visualleakdetector.asp 比VC自带的好用很多~ 下载解压后将lib和...
  • BoundsChecker for Visual C++ 6.0是针对开发出高质量的32位Visual C++ 6.0应用程序的最为...与一般的内存检测工具不同,BoundsChecker 能够校验最新的 Windows APIs,包括 ActiveX, DirectX, OLE/COM, ODBC等等。Bou
  • 内存泄露检测工具比较

    千次阅读 2012-06-01 23:57:03
    内存泄露检测工具比较 2009年09月17日 星期四 上午 12:12 1.  ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库。 2.  Dmalloc-Debug Malloc Library. 3. ...
  • 内存检测工具BoundsChecker使用详述

    千次阅读 2012-08-08 14:55:26
    或许你还不知道大名顶顶的Nu-Mega,但一定听说过他们的产品SoftICE,... BoundsChecker是一个运行时错误检测工具,它主要定位程序运行时期发生的各种错误。它通过驻留在Visual C++开发环境内部的自动处理调试程序
  • C++ 检测内存泄露工具 -- Windows平台

    千次阅读 2016-01-29 14:13:57
    C++ 检测内存泄露工具 -- Windows平台 平台:Windows7 64bit,编译器G++(mingw) 工具:Dr Memory,项目主页:https://code.google.com/p/drmemory/ (可能要FQ,可能会很慢,所以,可以直接按照...
  • Linux中的常用内存问题检测工具

    万次阅读 多人点赞 2015-06-27 12:53:08
    C/C++等底层语言在提供强大功能及性能的同时,其灵活的内存访问也带来了各种纠结的问题。如果crash的地方正是内存使用错误的地方,说明你人品好。...另外,静态检查也是一类方法,有很多工具(lint, cpp

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 95,668
精华内容 38,267
关键字:

windows内存检测工具