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

當(dāng)前位置:首頁 > 技術(shù)學(xué)院 > 技術(shù)前線
[導(dǎo)讀]內(nèi)存泄漏是指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存。內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計(jì)錯(cuò)誤,導(dǎo)致在釋放該段內(nèi)存之前就失去了對(duì)該段內(nèi)存的控制,從而造成了內(nèi)存的浪費(fèi)。

內(nèi)存泄漏是指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存。內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計(jì)錯(cuò)誤,導(dǎo)致在釋放該段內(nèi)存之前就失去了對(duì)該段內(nèi)存的控制,從而造成了內(nèi)存的浪費(fèi)。

在Linux中調(diào)試內(nèi)存泄漏,可以使用以下工具:

Valgrind:Valgrind是一個(gè)用于檢測(cè)C/C++程序中內(nèi)存錯(cuò)誤的工具,它可以檢測(cè)到內(nèi)存泄漏。安裝后,使用valgrind --leak-check=full your_program來運(yùn)行你的程序,它會(huì)在程序結(jié)束時(shí)報(bào)告內(nèi)存泄漏的詳細(xì)信息。

GDB:GDB是Linux下的調(diào)試工具,可以用來檢查程序在運(yùn)行時(shí)的內(nèi)存使用情況。但是GDB本身不能直接用來檢測(cè)內(nèi)存泄漏,但可以配合其他工具如gcore來生成core dump文件,然后用像Valgrind這樣的工具分析這個(gè)core dump。

MALLOC_TRACE:如果你的程序使用了mmap或其他方式分配了大量的內(nèi)存,但是沒有及時(shí)釋放,你可以設(shè)置環(huán)境變量MALLOC_TRACE來跟蹤內(nèi)存分配。例如:

export MALLOC_TRACE=memory.log./your_programmalloc_trace memory.log

這將會(huì)在memory.log文件中記錄所有的內(nèi)存分配和釋放操作,然后你可以手動(dòng)檢查這個(gè)文件來查找可能的內(nèi)存泄漏。

Application Instrumentation:你可以在你的代碼中添加自定義的內(nèi)存分配和釋放的跟蹤代碼,記錄每個(gè)內(nèi)存塊的分配和釋放信息,這樣可以更精確地定位內(nèi)存泄漏的位置。

DTrace/SystemTap:這些動(dòng)態(tài)跟蹤工具可以用來跟蹤程序的內(nèi)存分配和釋放行為,幫助定位內(nèi)存泄漏。

LeakSanitizer:如果你在使用LLVM/Clang編譯器,可以使用LeakSanitizer來檢測(cè)內(nèi)存泄漏。在編譯時(shí)加上-fsanitize=leak標(biāo)志,運(yùn)行時(shí)會(huì)報(bào)告內(nèi)存泄漏的位置。

選擇合適的工具根據(jù)你的程序和需求進(jìn)行使用。通常情況下,Valgrind是最簡單和最直接的選擇。

我們平時(shí)開發(fā)過程中不可避免的會(huì)遇到內(nèi)存泄漏問題,你是如何排查的呢?估計(jì)你是使用下面這幾個(gè)工具吧?

valgrind

mtrace

dmalloc

ccmalloc

memwatch

debug_new

這里程序喵向大家推薦新的一個(gè)排查內(nèi)存泄漏的工具:AddressSanitizer(ASan),該工具為gcc自帶,4.8以上版本都可以使用,支持Linux、OS、Android等多種平臺(tái),不止可以檢測(cè)內(nèi)存泄漏,它其實(shí)是一個(gè)內(nèi)存錯(cuò)誤檢測(cè)工具,可以檢測(cè)的問題有:

內(nèi)存泄漏

堆棧和全局內(nèi)存越界訪問

free后繼續(xù)使用

局部內(nèi)存被外層使用

Initialization order bugs(中文不知道怎么翻譯才好,后面有代碼舉例,重要)

1、Kmemleak介紹

在Linux內(nèi)核開發(fā)中,Kmemleak是一種用于檢測(cè)內(nèi)核中內(nèi)存泄漏的工具。

內(nèi)存泄漏指的是程序中已經(jīng)不再使用的內(nèi)存沒有被妥善地釋放,導(dǎo)致內(nèi)存的浪費(fèi)。內(nèi)核中的內(nèi)存泄漏同樣會(huì)導(dǎo)致系統(tǒng)性能下降、系統(tǒng)崩潰等問題。

Kmemleak能夠檢測(cè)內(nèi)核中的內(nèi)存泄漏,通過檢測(cè)內(nèi)核中未被釋放但又無法找到其使用位置的內(nèi)存,進(jìn)一步定位、修復(fù)內(nèi)存泄漏的問題。

在用戶空間,我們常用Valgrind來檢測(cè);在內(nèi)核空間,我們常用Kmemleak來檢測(cè)。

2、如何使用Kmemleak

2.1 內(nèi)核配置

內(nèi)核打開相應(yīng)配置:

CONFIG_DEBUG_KMEMLEAK:Kmemleak被加入到內(nèi)核

CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE設(shè)置為16000:該參數(shù)為記錄內(nèi)存泄露信息的內(nèi)存池,越大記錄信息越多。

CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF :Kmemleak默認(rèn)開關(guān)狀態(tài)

依賴的配置:

CONFIG_DEBUG_KERNEL:打開內(nèi)核調(diào)試功能

CONFIG_DEBUG_FS:需要借助到debugfsCONFIG_STACKTRACE:記錄進(jìn)程的堆棧信息

2.2 用戶空間配置

我們要想使用Kmemleak,需要掛在debugfs,來查看泄露的情況。

進(jìn)入文件系統(tǒng)后,進(jìn)行掛載:

代碼語言:javascript

復(fù)制

mount -t debugfs nodev /sys/kernel/debug/ # 掛在debugfs

設(shè)置掃描時(shí)間:

代碼語言:javascript

復(fù)制

echo scan=10 > /sys/kernel/debug/kmemleak # 10S掃描一次

默認(rèn)內(nèi)存泄露檢測(cè)時(shí)間為10min,上面設(shè)置為10s一次

查看泄露情況:

代碼語言:javascript

復(fù)制

cat /sys/kernel/debug/kmemleak # 查看內(nèi)存泄露情況

其他指令:

代碼語言:javascript

復(fù)制

echo scan > /sys/kernel/debug/kmemleak #觸發(fā)一次掃描

echo clear > /sys/kernel/debug/kmemleak #清除當(dāng)前 kmemleak 記錄的泄露信息

echo off > /sys/kernel/debug/kmemleak #關(guān)閉kmemleak(不可逆轉(zhuǎn)的)

echo stack=off > /sys/kernel/debug/kmemleak #關(guān)閉任務(wù)棧掃描

echo stack=on > /sys/kernel/debug/kmemleak #使能任務(wù)棧掃描

echo scan=on > /sys/kernel/debug/kmemleak #啟動(dòng)自動(dòng)內(nèi)存掃描線程

echo scan=off > /sys/kernel/debug/kmemleak #停止自動(dòng)內(nèi)存掃描線程

echo scan= > /sys/kernel/debug/kmemleak#設(shè)置自動(dòng)掃描線程掃描間隔,默認(rèn)是600,設(shè)置0則是停止掃描

echo dump= > /sys/kernel/debug/kmemleak #dump某個(gè)地址的內(nèi)存塊信息,比如上面的echo dump=0xffffffc008efd200 > /sys/kernel/debug/kmemleak即可查看詳細(xì)信息

2.3 通過Linux啟動(dòng)參數(shù)控制開關(guān)

Kmemleak的默認(rèn)開關(guān)狀態(tài)可以通過CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF 配置來控制,當(dāng)然也可以通過向Linux內(nèi)核啟動(dòng)參數(shù)中加入kmemleak=off來控制。

3、Kmemleak原理

Kmemleak提供了一種跟蹤垃圾回收器tracing garbage collector的原理,來檢測(cè)內(nèi)核中存在的內(nèi)存泄露,其不同之處在于:孤立的對(duì)象并沒有被釋放掉,而是通過/sys/kernel/debug/kmemleak僅僅被報(bào)告。

這種方法同樣應(yīng)用于Valgrind中,不過該工具主要用于檢測(cè)用戶空間不同應(yīng)用的內(nèi)存泄露情況。在用戶空間,我們常用Valgrind來檢測(cè)應(yīng)用進(jìn)程;在內(nèi)核空間,我們常用Kmemleak來檢測(cè)內(nèi)核代碼。

通過kmalloc()、vmalloc()、kmem_cache_alloc()等函數(shù)分配內(nèi)存時(shí),會(huì)跟蹤指針,堆棧等信息,將其存儲(chǔ)在一個(gè)紅黑樹中。

同時(shí)跟蹤相應(yīng)的釋放函數(shù)調(diào)用,并從kmemleak數(shù)據(jù)結(jié)構(gòu)中刪除指針。

簡單理解:相當(dāng)于追蹤內(nèi)存分配相關(guān)接口,記錄分配內(nèi)存的首地址,堆棧大小等信息,在內(nèi)存釋放階段將其刪除。

我們通過查看相關(guān)內(nèi)核文檔可知,內(nèi)存泄露檢測(cè)的掃描算法步驟如下:

將所有對(duì)象標(biāo)記為白色(最后剩余的白色對(duì)象將被視為孤立對(duì)象)

從數(shù)據(jù)段和堆棧開始掃描內(nèi)存,根據(jù)紅黑樹中存儲(chǔ)的地址信息來檢查值,如果找到指向白色對(duì)象的指針,則添加到灰色列表

掃描灰色列表以查找地址匹配的對(duì)象,直到灰色列表完成

剩下的白色對(duì)象被視為孤立對(duì)象,并通過/sys/kernel/debug/kmemleak進(jìn)行報(bào)告

4、Kmemleak API接口

代碼語言:javascript

復(fù)制

kmemleak_init - 初始化 kmemleak

kmemleak_alloc - 內(nèi)存塊分配通知

kmemleak_alloc_percpu - 通知 percpu 內(nèi)存塊分配

kmemleak_vmalloc - 通知 vmalloc() 內(nèi)存分配

kmemleak_free - 通知內(nèi)存塊釋放

kmemleak_free_part - 通知釋放部分內(nèi)存塊

kmemleak_free_percpu - 通知 percpu 內(nèi)存塊釋放

kmemleak_update_trace - 更新對(duì)象分配堆棧跟蹤

kmemleak_not_leak - 將對(duì)象標(biāo)記為非泄漏

kmemleak_ignore - 不掃描或報(bào)告對(duì)象泄漏

kmemleak_scan_area - 在內(nèi)存塊內(nèi)添加掃描區(qū)域

kmemleak_no_scan - 不掃描內(nèi)存塊

kmemleak_erase - 擦除指針變量中的舊值

kmemleak_alloc_recursive - 作為kmemleak_alloc,但檢查遞歸性

kmemleak_free_recursive - 作為kmemleak_free,但檢查遞歸性

5、Kmemleak特殊情況

漏報(bào):真正內(nèi)存泄露了,但是未報(bào)告,因?yàn)樵趦?nèi)存掃描期間找到的值指向此類對(duì)象。為了減少誤報(bào)的數(shù)量,kmemleak提供了kmemleak_ignore,kmemleak_scan_area,kmemleak_no_scan和kmemleak_erase功能

誤報(bào):實(shí)際沒有泄露,但是卻錯(cuò)誤的報(bào)告了內(nèi)存泄露。kmemleak提供了kmemleak_not_leak功能。

6、Kmemleak驗(yàn)證

內(nèi)核也提供了一個(gè)示例:kmemleak-test模塊,該模塊用以判斷是否打開了Kmemleak功能。通過配置CONFIG_DEBUG_KMEMLEAK_TEST選項(xiàng)可以選擇。

代碼語言:javascript

復(fù)制

# modprobe kmemleak-test

# echo scan > /sys/kernel/debug/kmemleak

代碼語言:javascript

復(fù)制

# cat /sys/kernel/debug/kmemleak

unreferenced object 0xffff89862ca702e8 (size 32):

comm "modprobe", pid 2088, jiffies 4294680594 (age 375.486s)

hex dump (first 32 bytes):

6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk

6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b a5 kkkkkkkkkkkkkkk.

backtrace:

[<00000000e0a73ec7>] 0xffffffffc01d2036

[<000000000c5d2a46>] do_one_initcall+0x41/0x1df

[<0000000046db7e0a>] do_init_module+0x55/0x200

[<00000000542b9814>] load_module+0x203c/0x2480

[<00000000c2850256>] __do_sys_finit_module+0xba/0xe0

[<000000006564e7ef>] do_syscall_64+0x43/0x110

[<000000007c873fa6>] entry_SYSCALL_64_after_hwframe+0x44/0xa9

...

本站聲明: 本文章由作者或相關(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ì)抑制與過流保護(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)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yà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)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決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)閉