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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

在Ubuntu 14.04 64bit上安装Valgrind并检查内存泄露

發布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Ubuntu 14.04 64bit上安装Valgrind并检查内存泄露 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
valgrind官網:http://valgrind.org/

1.安裝方法
第一種方式:下載目前最新的源碼,編譯安裝,在服務器上推薦這種方式
wget http://valgrind.org/downloads/valgrind-3.9.0.tar.bz2
tar xvf valgrind-3.9.0.tar.bz2
cd valgrind-3.9.0/
./configure
make
make install

第二種方式:使用二進制包安裝,以Ubuntu 14.04 64bit為例,輸入下面的安裝命令

sudo apt-get install valgrind

這個可能需要下載很大的安裝文件,如果在下載過程中中斷了,會造成以后無法再安裝其他的軟件,除非你下次升級軟件之前,先完成上面的安裝。

所以最好的方法,我選擇下面的第三種方法:

第三種方式:為了加快速度,現在chrome瀏覽器中下載二進制包,在ubuntu下是.deb包。這是我采用的方法。
下載地址為:http://pkgs.org/download/valgrind,注意不同的系統和版本,對應的包是不一樣的。
ubuntu 14.04 64bit的deb包下載地址:
http://archive.ubuntu.com/ubuntu/pool/main/v/valgrind/valgrind_3.6.1-0ubuntu1_i386.deb

下載完成后雙擊,默認用software center安裝即可!參見下面的截圖



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使用舉例


下面是一段明顯有問題的代碼文件valgrind_demo.c,我們使用Valgrind來查找它的錯誤。

//gcc -Wall -g valgrind_demo.c -o valgrind_demo
//
#include <stdlib.h>void f(void){int* x = malloc(10 * sizeof(int));x[10] = 0; //問題1:內存越界//問題2:內存泄露
}int main(int argc, char* argv[]){f();return 0;
}
首先編譯程序

gcc -Wall -g valgrind_demo.c -o valgrind_demo

這里使用-Wall是開啟編譯過程中所有的warning, -g是便于我們更仔細地調試程序.

然后運行程序,使用valgrind來檢查該程序的bug

valgrind --tool=memcheck --leak-check=full valgrind_demo

下面是valgrind檢查效果截圖


從截圖的最后一個標注處看出,該程序有2處錯誤, 分別位于代碼的兩個地方:

先看第一個問題, 是有4個字節的非法寫入, valgrind檢查到valgrind_demo.c文件的main函數12行調用了f函數, f函數在第6行代碼處調用malloc分配了40個字節的內存; 接著在f的第7行代碼處, 在分配的40個字節的后面緊接著要寫入4字節,這顯然是非法的, 因為40字節以外的內存我們沒有分配,的確是非法寫入(數組越界).

再看第二個問題, 說40字節的一個內存塊肯定會丟失,也就是內存泄露, 這個內存是在main函數的12行, 調用f函數中的malloc來進行分配的(內存空間沒有釋放).

從上面可以看出, valgrind提供的診斷信息還是非常準確的, 在實際調試代碼過程中, 很值得我們使用它來檢測大型程序的內存泄露問題.

如果在大型程序中會輸出大量的診斷信息到控制臺上, 我們可以采用將診斷信息輸入進本地文件的方法, 使用下面的命令

valgrind --tool=memcheck --leak-check=full --log-file=mem_leak.log valgrind_demo

這樣會在當前目錄下自動創建一個文件mem_leak.log來保存診斷信息,如果該文件已經存在,它會被overwrite

也可以邊gdb調試, 邊使用valgrind檢測內存錯誤

valgrind --tool=memcheck --leak-check=full --log-file=mem_leak.log gdb valgrind_demo

這個好處是,當程序有段錯誤時,可以使用bt查看棧幀中的變量, 便于分析問題, 同時又可以查看本地日志信息, 根據valgrind的診斷信息來更進一步定位錯誤代碼出處.

總結

以上是生活随笔為你收集整理的在Ubuntu 14.04 64bit上安装Valgrind并检查内存泄露的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。