日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用valgrind检查内存问题

發(fā)布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用valgrind检查内存问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
作者:gfree.wind@gmail.com
博客:blog.focus-linux.net ? linuxfocus.blog.chinaunix.net
?
? 本文的copyleft歸gfree.wind@gmail.com所有,使用GPL發(fā)布,可以自由拷貝,轉(zhuǎn)載。但轉(zhuǎn)載請保持文檔的完整性,注明原作者及原鏈接,嚴(yán)禁用于任何商業(yè)用途。 ======================================================================================================
工欲善其事,必先利其器。Valgrind作為一個免費(fèi)且優(yōu)秀的工具包,平時大部分人可能都是使用valgrind檢測內(nèi)存問題,如內(nèi)存泄露,越界等。其實Valgrind的用途遠(yuǎn)不止于此,其實際上為一個工具包,除了檢查內(nèi)存問題以外,還有其它多項用途。我準(zhǔn)備將其大致介紹一下。本不想再介紹Valgrind檢測內(nèi)存問題的用法的,但是又一想,畢竟這是Valgrind的一個最有名的用途,如果少了它,不免有些遺憾,所以還是把檢查內(nèi)存問題作為第一篇吧。
請看一下代碼:
  • #include?<stdlib.h>
  • #include?<stdio.h>
  • #include?<string.h>

  • static void mem_leak1(void)
  • {
  • ????char?*p?=?malloc(1);
  • }

  • static void mem_leak2(void)
  • {
  • ????FILE?*fp?=?fopen("test.txt",?"w");
  • }

  • static void mem_overrun1(void)
  • {
  • ????char?*p?=?malloc(1);
  • ????*(short*)p?=?2;

  • ????free(p);
  • }

  • static void mem_overrun2(void)
  • {
  • ????char?array[5];
  • ????strcpy(array,?"hello");
  • }

  • static void mem_double_free(void)
  • {
  • ????char?*p?=?malloc(1);
  • ????free(p);
  • ????free(p);
  • }

  • static void mem_use_wild_pointer(void)
  • {
  • ????char?*p?=?(void*)0x80184800;
  • ????*p?=?1;
  • }

  • static void mem_free_wild_pointer(void)
  • {
  • ????char?*p;
  • ????free(p);
  • }


  • int?main()
  • {
  • ????mem_leak1();
  • ????mem_leak2();
  • ????mem_overrun1();
  • ????mem_overrun2();
  • ????mem_double_free();
  • ????//mem_use_wild_pointer();
  • ????mem_free_wild_pointer();

  • ????return 0;
  • }
  • 這里一共列出了七種常見的內(nèi)存問題:1. 動態(tài)內(nèi)存泄露;2. 資源泄露,這里以文件描述符為例;3. 動態(tài)內(nèi)存越界;4.數(shù)組內(nèi)存越界;5.動態(tài)內(nèi)存double free;6.使用野指針,即未初始化的指針;7.釋放野指針,即未初始化的指針;其中由于本示例代碼過于簡單,第6中情況,使用野指針會直接導(dǎo)致crash,所以在main中,并沒有真正的調(diào)用那個示例代碼。由于valgrind只能檢測執(zhí)行到的代碼,所以在后面的報告中,不會報告第6種錯誤情況。但是,在大型的項目中,有可能使用野指針并不會導(dǎo)致程序crash。另外上面的7中情況,有些情況嚴(yán)格的說,實際上可以歸為一類。
    下面看怎樣執(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== <inherited from parent>
  • ==2326==
  • ==2326== Open file descriptor 1: /dev/pts/4
  • ==2326== <inherited from parent>
  • ==2326==
  • ==2326== Open file descriptor 0: /dev/pts/4
  • ==2326== <inherited from parent>
  • ==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)代碼量達(dá)到萬行,十萬行,甚至百萬行時。由于申請的內(nèi)存可能不是在一個地方使用,不可避免的被傳來傳去。這時,如果光是看review代碼來檢查問題,可能很難找到根本原因。這時,使用Valgrind則可以很容易的發(fā)現(xiàn)問題所在。
    當(dāng)然,Valgrind也不是萬能的。我也遇到過Valgrind無法找到問題,反而我通過不斷的review代碼找到了癥結(jié)。發(fā)現(xiàn)問題,解決問題,畢竟是末流。最好的方法,就是不引入內(nèi)存問題。這可以通過良好的代碼風(fēng)格和設(shè)計來實現(xiàn)的。
    寫代碼不是那么容易的。要用心,把代碼當(dāng)作自己的作品,真心的去寫好它。這樣,自然而然的就會把代碼寫好。

    總結(jié)

    以上是生活随笔為你收集整理的使用valgrind检查内存问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲av网址在线 | 中文字幕日韩一区 | 999超碰 | 一级少妇精品久久久久久久 | 亚洲激情网址 | 一级片免费视频 | 日韩在线观看视频一区二区三区 | 一级片av | 国产精品永久在线观看 | 日韩欧美专区 | 欧美日韩在线二区 | 亚洲伦理中文字幕 | 法国空姐在线观看免费 | 国产一区=区 | 狠狠操五月天 | 99热这里只有精品首页 | 中文字幕在线观看的网站 | 免费一区视频 | 亚洲性久久久 | a视频免费在线观看 | 亚洲欧美变态另类丝袜第一区 | 视频一区 国产 | 草色网 | 日本人妻伦在线中文字幕 | 欧美日韩国产激情 | 调教驯服丰满美艳麻麻在线视频 | 一区=区三区乱码 | 四虎少妇做爰免费视频网站四 | 日本三区在线 | 操碰在线视频 | 成人久久久久久 | 草逼视频网站 | 老汉色老汉首页av亚洲 | 3o一40一50一6o女人毛片 | 911福利视频 | 亚欧在线视频 | 国产精品久久久久永久免费看 | 日本精品一区在线 | 蜜桃视频久久 | av大片网 | 毛片美女 | 淫品色影院 | 中国无码人妻丰满熟妇啪啪软件 | 北条麻妃青青久久 | 国产精品99久久久久久大便 | 日韩av中文字幕在线免费观看 | 激情av一区 | 久久久久成人精品免费播放动漫 | 色婷婷丁香 | 国产成人精品一区二区三区无码熬 | 色综合视频在线 | 日本三级视频在线播放 | 婷婷丁香一区二区三区 | 性生生活大片又黄又 | 奇米影视第四色888 免费观看a毛片 | 欧美一区高清 | 国产不卡一 | 黄污视频在线播放 | www国产91| 免费特级黄色片 | 欧美一区国产一区 | 噼里啪啦高清 | 精品欧美一区二区在线观看 | 日产精品久久久久 | 婷婷777 | 日韩人妻精品一区二区三区 | 九九久久视频 | 欧美中字 | 欧美视频在线不卡 | 国产精品激情 | 美女隐私无遮挡 | 性爱免费视频 | 最新av观看| 伊人网在线播放 | 精品国自产拍在线观看 | 久久爱影视 | 国语播放老妇呻吟对白 | 日本不卡在线观看 | 国产99久久久国产精品 | 欧日韩在线观看 | 一级黄色片欧美 | 亚洲黄色在线视频 | 涩涩视频在线播放 | 色网综合 | 国产一区二区不卡在线 | 91精品国产成人www | 天天综合天天做天天综合 | 国产精品高清无码在线观看 | 欧美极品在线播放 | 欧美成人乱码一二三四区免费 | 午夜性生活视频 | 逼特逼在线视频 | 四季av中文字幕一区 | 一曲二曲三曲在线观看中文字幕动漫 | 亚洲色图av在线 | 欧美精品一区二 | 青青久久国产 | 亚洲日本中文字幕在线 | 日日爱886 |