• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Linux 內存調試工具- Valgrind 使用初探

            Posted on 2008-07-01 10:02 T.S Liu 閱讀(894) 評論(0)  編輯 收藏 引用 所屬分類: linux_bug_tool
            Valgrind 是在linux系統下開發應用程序時用于調試內存問題的工具。它尤其擅長發現內存管理的問題,它可以檢查程序運行時的內存泄漏問題。

               它的官方網址是 http://www.valgrind.org/

               下載最新版本的Valgrind,目前是3.2.0。 wget http://www.valgrind.org/downloads/valkyrie-1.2.0.tar.bz2

               執行常規的安裝步驟:./confgure && make && make install。注意: 系統必須安裝QT的開發包。即便這樣在make 時還是出現qplatformdefs.h這個文件找不到的情況,導致make失敗。查找系統中的qplatformdefs.h 之后,發現沒有存在于qt的標準頭文件目錄/usr/lib/qt-3.3/include。如是將/usr/lib/qt-3.3/mkspecs/linux-g++/ 目錄下該頭文件復制標準頭文件目錄,重新make ,后面一切OK。

            初次使用
                編譯如下代碼:  gcc -Wall example.c -g -o example 

            #include <stdlib.h>
                        void f(void)
                        {
                        int* x = malloc(10 * sizeof(int));
                        x[10] = 0;        // problem 1: heap block overrun
                        }                    // problem 2: memory leak -- x not freed
                        int main(void)
                        {
                        f();
                        return 0;
                        }

                 注意:gcc 的-g 選項讓Valgrind調試輸出時指出相應信息的代碼所在的行號。

             
            valgrind --tool=memcheck --leak-check=yes ./example

            ==6742== Memcheck, a memory error detector for x86-linux.
            ==6742== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward et al.
            ==6742== Using valgrind-2.2.0, a program supervision framework for x86-linux.
            ==6742== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al.
            ==6742== For more details, rerun with: -v
            ==6742==
            ==6742== Invalid write of size 4
            ==6742==    at 0x8048384: f (example.c:6)
            ==6742==    by 0x80483AC: main (example.c:12)
            ==6742==  Address 0x1B908050 is 0 bytes after a block of size 40 alloc'd
            ==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)
            ==6742==    by 0x8048377: f (example.c:5)
            ==6742==    by 0x80483AC: main (example.c:12)
            ==6742==
            ==6742== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 1)
            ==6742== malloc/free: in use at exit: 40 bytes in 1 blocks.
            ==6742== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.
            ==6742== For counts of detected errors, rerun with: -v
            ==6742== searching for pointers to 1 not-freed blocks.
            ==6742== checked 1360800 bytes.
            ==6742==
            ==6742==
            ==6742== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
            ==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)
            ==6742==    by 0x8048377: f (example.c:5)
            ==6742==    by 0x80483AC: main (example.c:12)
            ==6742==
            ==6742== LEAK SUMMARY:
            ==6742==    definitely lost: 40 bytes in 1 blocks.
            ==6742==    possibly lost:   0 bytes in 0 blocks.
            ==6742==    still reachable: 0 bytes in 0 blocks.
            ==6742==         suppressed: 0 bytes in 0 blocks.
            ==6742== Reachable blocks (those to which a pointer was found) are not shown.
            ==6742== To see them, rerun with: --show-reachable=yes

               上面的C程序存在兩個錯誤:1. 數組下標越界;2. 分配的內存沒有釋放,存在內存泄露的問題。對于錯誤1,看Valgrind的調試信息片斷
            ==6742== Invalid write of size 4
            ==6742==    at 0x8048384: f (example.c:6)
            ==6742==    by 0x80483AC: main (example.c:12)
            ==6742==  Address 0x1B908050 is 0 bytes after a block of size 40 alloc'd
            ==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)
            ==6742==    by 0x8048377: f (example.c:5)

            對于錯誤2,看這個

            ==6742== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.

            ......

            ==6742== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
            ==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)
            ==6742==    by 0x8048377: f (example.c:5)
            ==6742==    by 0x80483AC: main (example.c:12)

            热RE99久久精品国产66热| 青青青青久久精品国产h久久精品五福影院1421 | 久久精品无码午夜福利理论片| 精品伊人久久大线蕉色首页| 亚洲精品乱码久久久久久自慰| 99久久人妻无码精品系列蜜桃| 99久久精品无码一区二区毛片 | 9999国产精品欧美久久久久久| 久久久WWW免费人成精品| 久久久久波多野结衣高潮| 99精品久久久久中文字幕| 久久精品国产清自在天天线| 亚洲精品无码久久久久sm| 精品久久久久中文字幕一区| 亚洲αv久久久噜噜噜噜噜| 久久精品国产99久久香蕉| 久久精品成人欧美大片| 国产精品美女久久久免费| 欧美一区二区三区久久综合| 天天影视色香欲综合久久| 中文字幕亚洲综合久久2| 无码伊人66久久大杳蕉网站谷歌| 久久久久国产精品麻豆AR影院 | 久久国产精品一区| 久久国产亚洲高清观看| 少妇人妻综合久久中文字幕| 青青国产成人久久91网| 99久久精品国内| 亚洲AV日韩AV永久无码久久 | 国产成人久久激情91| 久久精品国产久精国产果冻传媒 | 欧美日韩精品久久久免费观看| 91麻豆精品国产91久久久久久| 国产精品美女久久久久久2018| 婷婷伊人久久大香线蕉AV| 久久无码国产专区精品| 久久亚洲AV成人无码软件| 久久人做人爽一区二区三区| 久久无码AV中文出轨人妻| 一本久道久久综合狠狠爱| 亚洲av成人无码久久精品|