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

歡迎訪問 生活随笔!

生活随笔

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

生活经验

内存、性能问题分析的利器——valgraind

發布時間:2023/11/27 生活经验 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内存、性能问题分析的利器——valgraind 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? valgrind是一個知名的分析軟件集。我們可以使用它進行內存、多線程及性能等各種問題的分析。它采用非侵入方式,所謂非侵入方式是指:我們不用在代碼中插入分析工具的庫。這對于開發者來說是友好的。因為如果要將工具編譯到文件中,或者要調用其提供的一些API,才能進行問題分析,無疑增大了用戶的學習和使用成本。(轉載請指明出于breaksoftware的csdn博客)

valgrind [valgrind-options] your-prog [your-prog-options]

? ? ? ? 當我們需要分析一款軟件時,只要采用上面格式的調用。其中your-prog是被分析的程序文件路徑,your-prog-options是原本要傳遞給待分析程序的參數。valgrind-options是valgrind的一些參數,最常用的是--tool=【tool_name】。我們可以使用不同的tool進行不同的分析,比如使用memcheck進行內存問題分析。

valgrind --tool=memcheck ls -l

? ? ? ? 那么valgrind和memcheck到底是什么關系呢?我們可以通過下圖表達出

? ? ? ? 當待分析程序片段第一次被執行時,valgrind會將代碼片段交給工具——比如內存調試時使用的memcheck處理,工具會在代碼中插入一些輔助分析的代碼片段。新的代碼會在valgrind模擬出的CPU上執行。然后valgrind會結合之前讀取到的待執行程序和其所關聯的庫文件的調試信息,輸出分析結果。

? ? ? ? 因為有新插入的代碼邏輯,valgrind運行下的程序都比其獨立運行時要慢。視選擇的工具不同,其效率可能是正常值的1/4~1/50。所以使用valgrind做性能分析時,一般不使用絕對數據,而使用相同環境下的相對數據進行對比。

? ? ? ? 為了讓valgrind讀取出準確的調試信息,待分析程序最好使用-O0禁止編譯器優化,以及使用-g讓編譯器把行號信息編入到文件中。比如對于下面的代碼

#include <stdlib.h>int main() {const int array_count = 4;int* p = malloc(array_count * sizeof(int));p[array_count] = 0;return 0;
}

? ? ? ? 如果我們使用O2參數讓編譯器去做優化

gcc -O2 mem_leak.c -o mem_leak

? ? ? ?編譯器會認為4~6行是沒有意義的,于是被優化了。于是使用valgrind分析不出代碼的問題

? ? ? ? 這并不是valgrind的錯誤,因為編譯器的確編譯出了一個空的main函數。我們可以用IDA反編譯看看

? ? ? ? 所以我們要使用O0禁止編譯優化

gcc -O0 mem_leak.c -o mem_leak

? ? ? ? 此時編譯出來的二進制代碼可以被解讀為

? ? ? ?此時使用valgrind分析,可以看到它給出內存寫違例和內存泄露的報告。

? ? ? ? 但是它沒有告訴我們哪行出錯了,于是我們要加上-g編譯參數

gcc -g -O0 mem_leak.c -o mem_leak

? ? ? ? 這樣我們可以看到第6行導致寫違例。

? ? ? ? 有時候,待分析的程序會啟動子程序。如果我們希望分析子程序,則需要增加--trace-children=yes。比如我們使用time啟動上面的程序

? ? ? ? 可以看出,valgrind分析出作為父程序的time是沒有問題的,但是作為子程序的mem_leak有兩個錯誤。

總結

以上是生活随笔為你收集整理的内存、性能问题分析的利器——valgraind的全部內容,希望文章能夠幫你解決所遇到的問題。

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