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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

Valgrind快速入门指南

發(fā)布時(shí)間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Valgrind快速入门指南 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Valgrind快速入門(mén)指南


介紹

Valgrind工具套件提供了許多調(diào)試和分析工具,可幫助您更快更準(zhǔn)確地完成程序。這些工具中最受歡迎的名為Memcheck。它可以檢測(cè)C和C ++程序中常見(jiàn)的許多與內(nèi)存相關(guān)的錯(cuò)誤,并可能導(dǎo)致崩潰和不可預(yù)測(cè)的行為。

本指南的其余部分提供了使用Memcheck開(kāi)始檢測(cè)程序中的內(nèi)存錯(cuò)誤所需的最少信息。有關(guān)Memcheck和其他工具的完整文檔,請(qǐng)閱讀用戶(hù)手冊(cè)。

準(zhǔn)備你的程序

編譯您的程序-g以包含調(diào)試信息,以便Memcheck的錯(cuò)誤消息包含確切的行號(hào)。使用-O0也是一個(gè)好主意,如果你能忍受減速。隨著?-O1錯(cuò)誤消息的行號(hào)可能不準(zhǔn)確,但總體上說(shuō),在上編譯代碼運(yùn)行MEMCHECK?-O1作品還算不錯(cuò),并且與運(yùn)行速度的提高-O0是相當(dāng)顯著。-O2不建議使用?以上內(nèi)容,因?yàn)镸emcheck偶爾會(huì)報(bào)告不真實(shí)存在的未初始化值錯(cuò)誤。

3.在Memcheck下運(yùn)行程序

如果你通常運(yùn)行這樣的程序:

myprog arg1 arg2

使用此命令行:

valgrind --leak-check = yes myprog arg1 arg2

Memcheck是默認(rèn)工具。該--leak-check?選項(xiàng)打開(kāi)詳細(xì)的內(nèi)存泄漏檢測(cè)器。

您的程序運(yùn)行速度要比正常速度慢(例如20到30次),并且使用更多的內(nèi)存。Memcheck將發(fā)出關(guān)于內(nèi)存錯(cuò)誤和它檢測(cè)到的泄漏的消息。

4.解釋Memcheck的輸出

這是一個(gè)C程序,在一個(gè)名為ac的文件中,內(nèi)存錯(cuò)誤和內(nèi)存泄漏。

#include <stdlib.h>void f(void){int * x = malloc(10 * sizeof(int));x [10] = 0; //問(wèn)題1:堆塊超載} //問(wèn)題2:內(nèi)存泄漏 - x未釋放int main(void){F();返回0;}

大多數(shù)錯(cuò)誤消息如下所示,其中描述了問(wèn)題1,堆塊溢出:

== 19182 ==無(wú)效的寫(xiě)入大小4== 19182 == at 0x804838F:f(example.c:6)== 19182 == by 0x80483AB:main(example.c:11)== 19182 ==地址0x1BA45050是大小為40的塊后的0個(gè)字節(jié)== 19182 == at 0x1B8FF5CD:malloc(vg_replace_malloc.c:130)== 19182 == by 0x8048385:f(example.c:5)== 19182 == by 0x80483AB:main(example.c:11)

注意事項(xiàng):

  • 每個(gè)錯(cuò)誤信息中有很多信息;?仔細(xì)閱讀

  • 19182是進(jìn)程ID;?通常不重要。

  • 第一行(“無(wú)效寫(xiě)入...”)告訴您是什么樣的錯(cuò)誤。在這里,程序?qū)懭胍恍﹥?nèi)存,它不應(yīng)該由于堆塊超載。

  • 第一行下方是堆棧跟蹤,告訴您發(fā)生問(wèn)題的位置。堆棧跟蹤可能會(huì)變得相當(dāng)大,并且令人困惑,尤其是在使用C ++ STL時(shí)。從底部讀取它們可以幫助。如果堆棧跟蹤不夠大,請(qǐng)使用該--num-callers選項(xiàng)使其更大。

  • 代碼地址(例如,0x804838F)通常不重要,但是對(duì)于跟蹤惡意錯(cuò)誤,偶爾至關(guān)重要。

  • 一些錯(cuò)誤消息有一個(gè)第二個(gè)組件描述所涉及的內(nèi)存地址。這一個(gè)表明,寫(xiě)入的內(nèi)存剛剛超過(guò)了在example.c的第5行分配了malloc()的塊的結(jié)尾。

這是按照?qǐng)?bào)告的順序修復(fù)錯(cuò)誤,因?yàn)橐郧暗腻e(cuò)誤可能是由早期錯(cuò)誤引起的。沒(méi)有這樣做是Memcheck的常見(jiàn)原因。

內(nèi)存泄漏消息如下所示:

== 19182 == 1個(gè)塊中的40個(gè)字節(jié)絕對(duì)丟失在1中的損失記錄1中== 19182 == at 0x1B8FF5CD:malloc(vg_replace_malloc.c:130)== 19182 == by 0x8048385:f(ac:5)== 19182 == by 0x80483AB:main(ac:11)

堆棧跟蹤告訴您泄漏內(nèi)存被分配的位置。Memcheck不能告訴你為什么內(nèi)存泄漏,不幸的是。(忽略“vg_replace_malloc.c”,這是一個(gè)實(shí)現(xiàn)細(xì)節(jié)。)

有幾種泄漏;?兩個(gè)最重要的類(lèi)別是:

  • “絕對(duì)丟失”:你的程序泄漏記憶 - 修復(fù)它!

  • “可能丟失”:你的程序泄漏記憶,除非你用指針來(lái)做有趣的事情(比如把它們指向堆塊的中間)。

Memcheck還報(bào)告未初始化值的使用,最常見(jiàn)的消息是“有條件跳轉(zhuǎn)或移動(dòng)取決于未初始化的值”。確定這些錯(cuò)誤的根本原因可能很困難。嘗試使用--track-origins=yes以獲取額外的信息。這使Memcheck運(yùn)行速度更慢,但是您獲得的額外信息通常可以節(jié)省大量時(shí)間來(lái)確定未初始化值的來(lái)源。

如果你不理解的錯(cuò)誤信息,請(qǐng)參閱?從MEMCHECK錯(cuò)誤消息的說(shuō)明中Valgrind的用戶(hù)手冊(cè)?擁有所有錯(cuò)誤信息MEMCHECK產(chǎn)生的例子。

注意事項(xiàng)

Memcheck不完美;?它偶爾會(huì)產(chǎn)生誤報(bào),并且存在抑制這些功能的機(jī)制(請(qǐng)參閱?禁止Valgrind用戶(hù)手冊(cè)中的錯(cuò)誤)。但是,99%的時(shí)間通常是正確的,所以你應(yīng)該謹(jǐn)防忽略其錯(cuò)誤信息。畢竟,你不會(huì)忽略編譯器生成的警告信息,對(duì)吧?如果Memcheck報(bào)告不能更改的庫(kù)代碼中的錯(cuò)誤,則抑制機(jī)制也很有用。默認(rèn)抑制集隱藏了很多,但您可能會(huì)遇到更多。

Memcheck無(wú)法檢測(cè)您的程序所具有的每個(gè)內(nèi)存錯(cuò)誤。例如,它無(wú)法檢測(cè)到靜態(tài)或堆棧上分配的數(shù)組的超范圍讀取或?qū)懭搿5鼞?yīng)該會(huì)檢測(cè)到可能會(huì)導(dǎo)致程序崩潰的許多錯(cuò)誤(例如導(dǎo)致分段錯(cuò)誤)。

嘗試使您的程序如此干凈,Memcheck報(bào)告沒(méi)有錯(cuò)誤。一旦你達(dá)到這個(gè)狀態(tài),更容易看出,當(dāng)程序更改導(dǎo)致Memcheck報(bào)告新的錯(cuò)誤。Memcheck使用幾年的經(jīng)驗(yàn)表明,可以使甚至巨大的程序運(yùn)行Memcheck-clean。例如,KDE,OpenOffice.org和Firefox的大部分都是Memcheck-clean,或者非常接近它。

總結(jié)

以上是生活随笔為你收集整理的Valgrind快速入门指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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