系統(tǒng)之家 - 系統(tǒng)光盤下載網(wǎng)站!

當(dāng)前位置:系統(tǒng)之家 > 系統(tǒng)教程 > Linux使用valgrind檢查內(nèi)存

Linux系統(tǒng)中怎么使用valgrind檢查內(nèi)存(2)

時間:2015-08-11 11:30:25 作者:zhijie 來源:系統(tǒng)之家 1. 掃描二維碼隨時看資訊 2. 請使用手機瀏覽器訪問: https://m.xitongzhijia.net/xtjc/20150811/55157.html 手機查看 評論

  執(zhí)行valgrind來檢測內(nèi)存錯誤:

  valgrind --track-fds=yes --leak-check=full --undef-value-errors=yes 。/a.out

  上面那些option的具體含義,可以參加valgrind --help,其中有些option默認(rèn)就是打開的,不過我習(xí)慣于明確的使用option,以示清晰。

  執(zhí)行后的報告:

  ==2326== Memcheck, a memory error detector

  ==2326== Copyright (C) 2002-2009, and GNU GPL‘d, by Julian Seward et al.

  ==2326== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info

  ==2326== Command: 。/a.out

  ==2326==

  /* 這里檢測到了動態(tài)內(nèi)存的越界,提示Invalid write。*/

  ==2326== Invalid write of size 2

  ==2326== at 0x80484B4: mem_overrun1 (in /home/fgao/works/test/a.out)

  ==2326== by 0x8048553: main (in /home/fgao/works/test/a.out)

  ==2326== Address 0x40211f0 is 0 bytes inside a block of size 1 alloc’d

  ==2326== at 0x4005BDC: malloc (vg_replace_malloc.c:195)

  ==2326== by 0x80484AD: mem_overrun1 (in /home/fgao/works/test/a.out)

  ==2326== by 0x8048553: main (in /home/fgao/works/test/a.out)

  ==2326==

  /* 這里檢測到了double free問題,提示Invalid Free */

  ==2326== Invalid free() / delete / delete[]

  ==2326== at 0x40057F6: free (vg_replace_malloc.c:325)

  ==2326== by 0x8048514: mem_double_free (in /home/fgao/works/test/a.out)

  ==2326== by 0x804855D: main (in /home/fgao/works/test/a.out)

  ==2326== Address 0x4021228 is 0 bytes inside a block of size 1 free‘d

  ==2326== at 0x40057F6: free (vg_replace_malloc.c:325)

  ==2326== by 0x8048509: mem_double_free (in /home/fgao/works/test/a.out)

  ==2326== by 0x804855D: main (in /home/fgao/works/test/a.out)

  ==2326==

  /* 這里檢測到了未初始化變量 */

  ==2326== Conditional jump or move depends on uninitialised value(s)

  ==2326== at 0x40057B6: free (vg_replace_malloc.c:325)

  ==2326== by 0x804853C: mem_free_wild_pointer (in /home/fgao/works/test/a.out)

  ==2326== by 0x8048562: main (in /home/fgao/works/test/a.out)

  ==2326==

  /* 這里檢測到了非法是否野指針 */

  ==2326== Invalid free() / delete / delete[]

  ==2326== at 0x40057F6: free (vg_replace_malloc.c:325)

  ==2326== by 0x804853C: mem_free_wild_pointer (in /home/fgao/works/test/a.out)

  ==2326== by 0x8048562: main (in /home/fgao/works/test/a.out)

  ==2326== Address 0x4021228 is 0 bytes inside a block of size 1 free’d

  ==2326== at 0x40057F6: free (vg_replace_malloc.c:325)

  ==2326== by 0x8048509: mem_double_free (in /home/fgao/works/test/a.out)

  ==2326== by 0x804855D: main (in /home/fgao/works/test/a.out)

  ==2326==

  ==2326==

  /*

  這里檢測到了文件指針資源的泄露,下面提示說有4個文件描述符在退出時仍是打開的。

  描述符0,1,2無需關(guān)心,通過報告,可以發(fā)現(xiàn)程序中自己明確打開的文件描述符沒有關(guān)閉。

  */

  ==2326== FILE DESCRIPTORS: 4 open at exit.

  ==2326== Open file descriptor 3: test.txt

  ==2326== at 0x68D613: __open_nocancel (in /lib/libc-2.12.so)

  ==2326== by 0x61F8EC: __fopen_internal (in /lib/libc-2.12.so)

  ==2326== by 0x61F94B: fopen@@GLIBC_2.1 (in /lib/libc-2.12.so)

  ==2326== by 0x8048496: mem_leak2 (in /home/fgao/works/test/a.out)

  ==2326== by 0x804854E: main (in /home/fgao/works/test/a.out)

  ==2326==

  ==2326== Open file descriptor 2: /dev/pts/4

  ==2326==

  ==2326==

  ==2326== Open file descriptor 1: /dev/pts/4

  ==2326==

  ==2326==

  ==2326== Open file descriptor 0: /dev/pts/4

  ==2326==

  ==2326==

  ==2326==

  /* 堆信息的總結(jié):一共調(diào)用4次alloc,4次free。之所以正好相等,因為上面有一函數(shù)少了free,有一個函數(shù)多了一個free */

  ==2326== HEAP SUMMARY:

  ==2326== in use at exit: 353 bytes in 2 blocks

  ==2326== total heap usage: 4 allocs, 4 frees, 355 bytes allocated

  ==2326==

  /* 檢測到一個字節(jié)的內(nèi)存泄露 */

  ==2326== 1 bytes in 1 blocks are definitely lost in loss record 1 of 2

  ==2326== at 0x4005BDC: malloc (vg_replace_malloc.c:195)

  ==2326== by 0x8048475: mem_leak1 (in /home/fgao/works/test/a.out)

  ==2326== by 0x8048549: main (in /home/fgao/works/test/a.out)

  ==2326==

  /* 內(nèi)存泄露的總結(jié) */

  ==2326== LEAK SUMMARY:

  ==2326== definitely lost: 1 bytes in 1 blocks

  ==2326== indirectly lost: 0 bytes in 0 blocks

  ==2326== possibly lost: 0 bytes in 0 blocks

  ==2326== still reachable: 352 bytes in 1 blocks

  ==2326== suppressed: 0 bytes in 0 blocks

  ==2326== Reachable blocks (those to which a pointer was found) are not shown.

  ==2326== To see them, rerun with: --leak-check=full --show-reachable=yes

  ==2326==

  ==2326== For counts of detected and suppressed errors, rerun with: -v

  ==2326== Use --track-origins=yes to see where uninitialised values come from

  ==2326== ERROR SUMMARY: 5 errors from 5 contexts (suppressed: 12 from 8)

  這個只是一個簡單的示例程序,即使沒有Valgrind,我們也可以很輕易的發(fā)現(xiàn)問題。但是在真實的項目中,當(dāng)代碼量達到萬行,十萬行,甚至百 萬行時。由于申請的內(nèi)存可能不是在一個地方使用,不可避免的被傳來傳去。這時,如果光是看review代碼來檢查問題,可能很難找到根本原因。這時,使用 Valgrind則可以很容易的發(fā)現(xiàn)問題所在。

  以上就是Linux系統(tǒng)中怎么使用valgrind檢查內(nèi)存的介紹了,當(dāng)然還有一些錯誤時valgrind檢查不到的,用戶應(yīng)該盡量避免出現(xiàn)太多的錯誤。

發(fā)表評論

0

沒有更多評論了

評論就這些咯,讓大家也知道你的獨特見解

立即評論

以上留言僅代表用戶個人觀點,不代表系統(tǒng)之家立場

其他版本軟件

熱門教程

人氣教程排行

Linux系統(tǒng)推薦

掃碼關(guān)注
掃碼關(guān)注

掃碼關(guān)注 官方交流群 軟件收錄