内存、性能问题分析的利器——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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zookeeper快速入门——部署
- 下一篇: 内存问题分析的利器——valgrind的