U盤精靈
導航: U盤精靈 > U盤資訊
相關欄目: U盤資訊 標簽 U盤測評 U盤安全

內存測試,使用查看信息 解決內存管理問題的最佳利器

發布時間: 2020-03-15 03:37

Valgrind是一個動態分析工具,能夠自動檢測許多內存管理問題、線程bug, 并且能夠分析程序的狀況。它內部支持多個工具集,包括內存錯誤檢測器,線程錯誤檢測器,緩存分析器、堆分析器等,默認使用的是內存檢測器(memcheck), 它是使用最多的一個內存檢測工具。當然,你也可以基于Valgrind自己建立新的工具。

Valgrind支持的平臺有:

Valgrind是開源免費的軟件,基于GNU General Public License, version 2。

一、快速入門

Valgrind工具集中最受歡迎的是memcheck, 它滿足大部分的場景。memcheck能夠檢測內存相關的錯誤,并且是采用C/C++編譯的程序,程序運行過程中奔潰或者不可預料的行為都可以使用Valgrind中的memcheck來進行檢測。

使用Valgrind前,采用-g選項編譯程序,這樣memcheck才能夠提取到具體的行號信息,同時可以使用-O0優化選項,但是如果使用-O1選項,那么顯示的行號信息可能就不準確;不推薦使用-O2選項,如果使用的話,memcheck偶爾上報不是真的存在的未初始化的錯誤信息。

命令行一般的使用格式如下所示,–leak-check=yes是打開內存泄露的檢測器。

下面提供一個C++例子,該例子有內存泄露和訪問不存在地址的兩個錯誤:

錯誤信息描述如下,表示訪問不存在地址,第一行“Invalid write of size 4”表明什么類型錯誤,寫數據到內存中,而該內存是不應該訪問的。1066表示進程id號。如果錯誤的堆棧信息顯示不夠顯示,那么可以加上選項–num-callers,再加上層級數量,比如–num-callers=20。

內存泄露的錯誤信息提示描述如下, 它會告訴你內存分配的位置,但是它不能告訴你內存為什么泄露。

一般有幾種內存泄露的類型,比較重要的兩種是definitely lost和possibly lost,definitely lost是確定內存泄露,需要修復它,possibly lost可能存在內存泄露,需要仔細確認。

另外memcheck比較經常會上報沒有初始化值的信息,但是要定位到錯誤信息的根本原因是比較困難的,對此,可以添加參數–track-origins=yes來獲取更多的信息,但是,這樣會使得memcheck運行得更慢。

二、memcheck的錯誤信息

memcheck是內存錯誤的檢測器,他可以檢測C/C++常見的下列錯誤問題:

訪問不應該訪問的內存,例如堆溢出、棧溢出、訪問已經釋放的內存使用沒有定義的值,例如值沒有初始化不正確的釋放堆內存,例如重復釋放內存,malloc/new/new[] 和 free/delete/delete[]沒有一一對應使用使用memcpy函數,源地址和目的地址重疊向內存分配函數中,傳遞一個不正確的參數,例如負數內存泄露接下來將通過幾個例子來說明。

非法讀寫錯誤,例如讀取已經釋放內存的地址,為了獲取更多的信息,可以加上–read-var-info=yes的選項。

使用沒有定義的值,例如定義了變量,但是沒有初始化,如果信息不夠詳細,可以添加參數–track-origins=yes來獲取更多的信息。

如果沒有初始化變量,就會顯示“Conditional jump or move depends on uninitialised value”信息。

非法釋放地址,例如重復釋放內存。

重復釋放內存就會提示“Invalid free()”信息。

調用申請和釋放內存的方法不匹配,例如malloc申請內存,但是使用delete來釋放,對某些系統來說是不允許的,因此,為了保證程序健壯,使用malloc,那么對應使用free; 使用new,那么對應使用delete; 使用new [], 那么對應使用delete []。

三、Valgrind調用QtCreator程序

mac系統通過QtCreator創建程序之后,也可以采用Valgrind在終端上檢測QtCreator生成的程序。

首先進入QtCreator編譯生成的文件目錄。

接著選擇build開頭的目錄,右鍵彈出的列表選擇“服務”->”新建位于文件夾位置的終端窗口”來啟動終端, 終端輸入如下所示的命令來使用Valgrind測試QtCreator編譯生成的程序JQtTestStudy.app。

四、局限性

Memcheck并不完美,它也會出現誤報,但是它有99%的準確性,對于它提示的信息我們應該警惕。memcheck不能檢測每一種內存錯誤,比如它不能檢測到對靜態分配或堆棧上的數組的超出范圍的讀寫,但是它還是能夠檢測出使得你程序奔潰的錯誤,例如段錯誤segmentation fault。五、總結

程序開發過程中,可能會遇到崩潰的問題,如果代碼量很多的時候,我們可能會使用gdb來查看coredump信息,但是有時候gdb的信息比較簡單,沒有更加詳細的堆棧信息,那么就可以考慮使用Valgrind進行分析。最近,工作中遇到一個問題,程序運行過程中,會偶發崩潰問題,使用gdb查看coredump信息,顯示是重復釋放內存,但是堆棧信息很少,一直找不到位置,后來使用Valgrind來查看程序,仔細查看從Valgrind提供的堆棧信息,很快找到問題的位置,原因確實是重復釋放內存。

溫馨提示:Valgrind經常上報了很多錯誤提示信息,這個可能是同樣一個地方調用了多次,所以,如果解決了一個地方的問題,錯誤提示信息就會全部消失,需要耐心仔細。


本文關鍵詞:內存測試

最新推薦

我要分享到:
  • 如何解除u盤寫保護

    [2019-04-23]安裝系統時會把ISO刻錄成光盤,再使用光驅引導光盤安裝系統。如果沒有光盤的話,使用U盤也是可以完成系統的安裝的。并且現在大多數人會選擇使用更加便捷的U盤。Win...

  • u盤殺毒專家企業版破解版/對于鍵盤上三個燈的分

    [2020-01-05]ATX電源引發的常見故障分析,當采用ATX電源的計算機系統出現故障時,首先我們可以進行這類操作我們可以從CMOS設置、Windows中ACPI的設置及電源和主板...

  • 解決Windows8安裝Office出現錯誤2705的方法

    [2018-06-30]Windows8安裝Office過程中出現錯誤,錯誤代碼2705。這個錯誤是Office與中文輸入編輯器沖突引起的。下面就來介紹一下Windows8安裝Offi...

  • u盤殺毒專家3.3破解版/360殺毒 u盤格式化

    日本变态强奷在线播放5000[2019-08-15]win7系統里面一般是存在五個硬盤,而且是按照我們熟悉的前五個英文字母ABCDE來命名,所以當我們突然發現自己的電腦里出現了個“本地磁盤Q&rdqu...

  • u盤殺毒專家破解版免費/u盤啟動UltraDefrag碎片整理

    [2019-03-09]在Linux系統中,常常需要清理一些比較大的文件來擴充磁盤的可用空間但是清理這些文件之前就要先找到這些文件,或者是把大文件Linux目錄全都列舉出來本文就以aw...

  • 怎么用殺毒軟件給u盤殺毒

    [2018-09-10]Linux系統如果忘記了root密碼,可以在單用戶模式下對密碼進行修改,通過破解密碼來找回root密碼。下面就來介紹一下Linux如何在單用戶模式下破解密碼?具...

  • u盤插入電腦就殺毒 如何設置

    日本变态强奷在线播放5000[2019-09-12]安卓手機除了內存越用越小這個問題外,最大的問題就是耗電快了,下面小編為大家整理了解決安卓手機耗電快的22個小技巧,希望對大家有用。1.降低屏幕亮度。通過設置-&...

  • u盤強力殺毒軟件/“隱身”U盤使用方法

    [2019-01-20]有時候我們使用U盤時運行速度過慢,如果排除感染電腦病毒和U盤本身的質量問題,可能是因為使用U盤時沒有開啟系統中“打開后寫緩存”這一功能下...

  • 硬盤上WinPE引導文件的作用

    [2018-06-09]今年4月8日,XP系統被正式宣布退役后,越來越多使用XP系統的朋友都紛紛將系統給換成win7系統了,很多朋友都是直接選擇用U盤將XP系統升級至win7系統。但是...

  • win7系統位數教你一秒學會查看

    [2019-01-03]我們都知道,修改注冊表可以禁止別人在電腦使用U盤,但如果不想禁止了,我們又要重新修改注冊表,這無疑是非常浪費時間和精力的。其實我們完全可以將“禁用/...

  • 最新文章

    最新推薦

  • U盤精靈  |   標簽  |   U盤測評  |   U盤安全  |   U盤資訊
    @powered by U盤精靈 2020