日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式大雜燴
[導(dǎo)讀]關(guān)注「Linux大陸」,選擇「星標(biāo)公眾號(hào)」一起進(jìn)步!Valgrind簡(jiǎn)介Valgrind是一套Linux下,開放源代碼(GPLV2)的仿真調(diào)試工具的集合。Valgrind工具包包含多個(gè)工具,如Memcheck、Cachegrind、Helgrind、Callgrind、Massi...

關(guān)注「Linux大陸」,選擇「星標(biāo)公眾號(hào)」一起進(jìn)步!

Valgrind簡(jiǎn)介

Valgrind是一套Linux下,開放源代碼(GPL V2)的仿真調(diào)試工具的集合。

Valgrind工具包包含多個(gè)工具,如Memcheck、Cachegrind、Helgrind、Callgrind、Massif。

Memcheck工具

Memcheck工具是Valgrind中最常用的工具,用來(lái)檢測(cè)程序中出現(xiàn)的內(nèi)存問(wèn)題。它能檢測(cè)如下問(wèn)題:

  • 使用未初始化內(nèi)存;
  • 使用釋放后的內(nèi)存;
  • 使用超出malloc分配的內(nèi)存塊;
  • 對(duì)堆棧的非法訪問(wèn);
  • 內(nèi)存泄漏;
  • 不正確的malloc/free或new/delete匹配;
  • memcpy()相關(guān)函數(shù)中的dst和src指針重疊。

Cachegrind工具

Callgrind收集程序運(yùn)行時(shí)的一些數(shù)據(jù),函數(shù)調(diào)用關(guān)系等信息,還可以有選擇地進(jìn)行cache模擬。在運(yùn)行結(jié)束時(shí),它會(huì)把分析數(shù)據(jù)寫入一個(gè)文件。callgrind_annotate可以把這個(gè)文件的內(nèi)容轉(zhuǎn)化成可讀的形式。

Helgrind工具

它主要用來(lái)檢查多線程程序中出現(xiàn)的競(jìng)爭(zhēng)問(wèn)題。Helgrind尋找內(nèi)存中被多個(gè)線程訪問(wèn),而又沒(méi)有一貫加鎖的區(qū)域,這些區(qū)域往往是線程之間失去同步的地方,而且會(huì)導(dǎo)致難以發(fā)掘的錯(cuò)誤。

Helgrind實(shí)現(xiàn)了名為” Eraser” 的競(jìng)爭(zhēng)檢測(cè)算法,并做了進(jìn)一步改進(jìn),減少了報(bào)告錯(cuò)誤的次數(shù)。

Callgrind工具

它模擬 CPU中的一級(jí)緩存I1,D1和L2二級(jí)緩存,能夠精確地指出程序中 cache的丟失和命中。如果需要,它還能夠?yàn)槲覀兲峁ヽache丟失次數(shù),內(nèi)存引用次數(shù),以及每行代碼,每個(gè)函數(shù),每個(gè)模塊,整個(gè)程序產(chǎn)生的指令數(shù)。這對(duì)優(yōu)化程序有很大的幫助。

Massif工具

堆棧分析器,它能測(cè)量程序在堆棧中使用了多少內(nèi)存,告訴我們堆塊,堆管理塊和棧的大小。

Massif能幫助我們減少內(nèi)存的使用,在帶有虛擬內(nèi)存的現(xiàn)代系統(tǒng)中,它還能夠加速我們程序的運(yùn)行,減少程序停留在交換區(qū)中的幾率。

Valgrind由內(nèi)核(core)以及基于內(nèi)核的其他調(diào)試工具組成。其基于仿真方式對(duì)程序進(jìn)行調(diào)試,它先于應(yīng)用程序獲取實(shí)際處理器的控制權(quán),并在實(shí)際處理器的基礎(chǔ)上仿真一個(gè)虛擬處理器,并使應(yīng)用程序運(yùn)行于這個(gè)虛擬處理器之上,從而對(duì)應(yīng)用程序的運(yùn)行進(jìn)行監(jiān)視。

應(yīng)用程序并不知道該處理器是虛擬的還是實(shí)際的,已經(jīng)編譯成二進(jìn)制代碼的應(yīng)用程序并不用重新進(jìn)行編譯,Valgrind 直接解釋二進(jìn)制代碼使得應(yīng)用程序基于它運(yùn)行,從而能夠檢查內(nèi)存操作時(shí)可能出現(xiàn)的錯(cuò)誤。

所以在Valgrind下運(yùn)行的程序運(yùn)行速度要慢得多,而且使用的內(nèi)存要多得多。因此,最好在性能好的機(jī)器上使用Valgrind,并且是在開發(fā)調(diào)試階段使用。

Valgrind安裝

Valgrind的安裝方式很簡(jiǎn)單。我們首先查看一下我們的系統(tǒng)中有沒(méi)有Valgrind:

顯然,我們這里的系統(tǒng)中沒(méi)有Valgrind,按提示輸入如下命令安裝即可:

sudo?apt?install?valgrind

另外,也可以通過(guò)下載源碼編譯、安裝。

源碼地址:

?http://valgrind.org/

?
下載源碼的命令:

wget?http://valgrind.org/downloads/valgrind-3.14.0.tar.bz2

Valgrind使用

準(zhǔn)備一個(gè)有內(nèi)存泄漏、內(nèi)存越界問(wèn)題的demo進(jìn)行測(cè)試。為了方便,我們使用官方提供的一個(gè)經(jīng)典的測(cè)試demo:

「valgrind_test.c:」

#include?

void?f(void)
{
?int*?x?=?malloc(10?*?sizeof(int));
?x[10]?=?0;???????//?problem?1:?heap?block?overrun
}?????????????????//?problem?2:?memory?leak?--?x?not?freed

int?main(void)
{
?f();
?return?0;
}
這份代碼存在兩個(gè)問(wèn)題:

  • 使用超出malloc分配的內(nèi)存。
  • 內(nèi)存泄漏。
下面一起來(lái)使用valgrind的Memcheck工具來(lái)檢測(cè)這份程序。

首先,我們使用-g編譯程序以包含調(diào)試信息,以便Memcheck的錯(cuò)誤消息包含確切的行號(hào)。

gcc?-g?valgrind_test.c?-o?valgrind_test
使用valgrind檢測(cè)valgrind_test程序:

valgrind?--leak-check=yes?./valgrind_test
我們可以用--tool參數(shù)指明使用的工具,如:

--tool=memcheck
如果不明確設(shè)置--tool參數(shù),則valgrind的檢測(cè)工具默認(rèn)使用的是Memcheck工具。--leak-check=yes選項(xiàng)打開詳細(xì)的內(nèi)存泄漏檢測(cè)器。

我們執(zhí)行檢測(cè)工具之后的結(jié)果如:

==7407==?Memcheck,?a?memory?error?detector
==7407==?Copyright?(C)?2002-2017,?and?GNU?GPL'd,?by?Julian?Seward?et?al.
==7407==?Using?Valgrind-3.13.0?and?LibVEX;?rerun?with?-h?for?copyright?info
==7407==?Command:?./valgrind_test
==7407==?
==7407==?Invalid?write?of?size?4
==7407==????at?0x108668:?f?(valgrind_test.c:6)
==7407==????by?0x108679:?main?(valgrind_test.c:11)
==7407==??Address?0x522d068?is?0?bytes?after?a?block?of?size?40?alloc'
d
==7407==????at?0x4C2FB0F:?malloc?(in?/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7407==????by?0x10865B:?f?(valgrind_test.c:5)
==7407==????by?0x108679:?main?(valgrind_test.c:11)
==7407==?
==7407==?
==7407==?HEAP?SUMMARY:
==7407==?????in?use?at?exit:?40?bytes?in?1?blocks
==7407==???total?heap?usage:?1?allocs,?0?frees,?40?bytes?allocated
==7407==?
==7407==?40?bytes?in?1?blocks?are?definitely?lost?in?loss?record?1?of?1
==7407==????at?0x4C2FB0F:?malloc?(in?/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7407==????by?0x10865B:?f?(valgrind_test.c:5)
==7407==????by?0x108679:?main?(valgrind_test.c:11)
==7407==?
==7407==?LEAK?SUMMARY:
==7407==????definitely?lost:?40?bytes?in?1?blocks
==7407==????indirectly?lost:?0?bytes?in?0?blocks
==7407==??????possibly?lost:?0?bytes?in?0?blocks
==7407==????still?reachable:?0?bytes?in?0?blocks
==7407==?????????suppressed:?0?bytes?in?0?blocks
==7407==?
==7407==?For?counts?of?detected?and?suppressed?errors,?rerun?with:?-v
==7407==?ERROR?SUMMARY:?2?errors?from?2?contexts?(suppressed:?0?from?0)
輸出結(jié)果包含有很多信息,我們可以很容易查看到了關(guān)鍵的信息:

其中,輸出信息告訴我們無(wú)效地寫入了4個(gè)字節(jié),并且提示了可能出現(xiàn)問(wèn)題的代碼行數(shù)。堆棧跟蹤告訴我們調(diào)用了一次malloc申請(qǐng)內(nèi)存,但并沒(méi)有free,并且指出了在哪里分配了內(nèi)存。

另外,這里的7407表示的是進(jìn)程ID號(hào)。

內(nèi)存泄漏有幾種類型,最重要的兩類是:

  • definitely lost(明確的泄漏)
  • possibly lost(可能的泄漏)
其中,明確的泄漏必須要進(jìn)行修復(fù)。

以上就是關(guān)于valgrind最常用的Memcheck工具的簡(jiǎn)單使用介紹,使用Memcheck工具有時(shí)候我們可以很清楚地檢測(cè)出程序存在的一些隱患。其它工具今后有用到的話再做分享,大家感興趣的話可以自行去研究學(xué)習(xí)。

Valgrind交叉編譯

1、下載valgrind源碼包:

wget?http://valgrind.org/downloads/valgrind-3.14.0.tar.bz2
2、修改valgrind里的configure文件:

把 armv7 * ) 改成 armv7 * |arm)。

3、生成Makefile

./configure?--host=arm-linux-gnueabihf?CC=/home/LinuxZn/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-gcc?CXX=/home/LinuxZn/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-g ?--prefix=$PWD/tmp

這個(gè)命令似乎很長(zhǎng),但并不難,只是加了幾個(gè)配置參數(shù)。這些配置參數(shù)怎么看?

我們可以輸入./configure --help命令來(lái)查看支持的配置:

下面我們依次來(lái)分析上面那個(gè)很長(zhǎng)的命令:

  • --host=arm-linux-gnueabihf:表明了我們最終可執(zhí)行文件運(yùn)行的環(huán)境。

  • CC=/home/LinuxZn/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-gcc:這是指定我們的交叉編譯工具arm-linux-gnueabihf-gcc,這里直接給出絕對(duì)路徑。

  • CXX=/home/LinuxZn/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-g :這是指定我們的交叉編譯工具arm-linux-gnueabihf-g ,這里直接給出絕對(duì)路徑。

  • --prefix=$PWD/tmp:指定安裝的路徑。表明安裝路徑在當(dāng)前路徑下的tmp文件夾中。

這時(shí)候已經(jīng)生成了Makefile文件:

編譯、安裝:

make
make?install
安裝完成后tmp文件夾下的內(nèi)容為:

這時(shí)候我們就可以把tmp整個(gè)文件夾拷到板子上使用了。tmp的大小為一百多兆,注意查看板子存儲(chǔ)空間夠不夠:

我們可以配置板子上的valgrind環(huán)境。如果僅是臨時(shí)使用,可以這么用:

tmp/bin/valgrind?--tool=memcheck?--leak-check=yes?./valgrind_test
其中,tmp文件夾與與valgrind_test在同一路徑。這時(shí)候可能會(huì)報(bào)如下錯(cuò)誤:

“valgrind:?failed?to?start?tool?‘memcheck’?for?platform?‘a(chǎn)rm-linux’:?No?such?file?or?directory”
這是因?yàn)関algrind需要依賴其動(dòng)態(tài)庫(kù),而沒(méi)有找到動(dòng)態(tài)庫(kù)。因?yàn)槭桥R時(shí)測(cè)試,在valgrind_test路徑輸入如下命令進(jìn)行設(shè)置:

export?VALGRIND_LIB="tmp/lib/valgrind"
這只是在當(dāng)前開發(fā)板終端生效,下次重新進(jìn)入開發(fā)板終端需要重新設(shè)置。

以上就是本次的分享。碼字不易,期待你的三連~

大家平時(shí)都用些什么工具呢?

歡迎留言分享~

參考資料

1、https://www.valgrind.org/docs/manual/quick-start.html#quick-start.prepare

2、https://blog.csdn.net/andylauren/article/details/93189740

3、https://zhuanlan.zhihu.com/p/75416381

4、https://blog.csdn.net/listener51/article/details/86716497?depth_1-

歷史文章:

一文讀懂a(chǎn)pt、deb與背后的知識(shí)

2021-06-12

實(shí)用 | 遠(yuǎn)程gdb調(diào)試

2021-06-20

有趣 | 最近遇到一個(gè)狡猾的bug,復(fù)盤分享

2021-06-20



本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉