一個(gè)動(dòng)態(tài)內(nèi)存管理模塊的實(shí)現(xiàn)
發(fā)布時(shí)間:2007/9/11 0:00:00 訪問(wèn)次數(shù):484
摘要:介紹一個(gè)動(dòng)態(tài)內(nèi)存管理模塊,可以有效地檢測(cè)C程序中內(nèi)存泄漏和寫(xiě)內(nèi)存越界等錯(cuò)誤,適用于具有標(biāo)準(zhǔn)C語(yǔ)言開(kāi)發(fā)環(huán)境的各種平臺(tái)。
關(guān)鍵詞:C語(yǔ)言 動(dòng)態(tài)內(nèi)存 內(nèi)存泄漏 寫(xiě)越界
引言
當(dāng)前,絕大多數(shù)嵌入式平臺(tái)上的軟件都采用C語(yǔ)言編寫(xiě)。除了代碼簡(jiǎn)潔、運(yùn)行高效之外,靈活操作內(nèi)存的能力更是C語(yǔ)言的重要特色。然而,不恰當(dāng)?shù)膬?nèi)存操作通常也是錯(cuò)誤的根源之一。如“內(nèi)存泄漏” ——不能正確地釋放已分配的動(dòng)態(tài)內(nèi)存,就是一種非常難于檢測(cè)的存錯(cuò)誤。持續(xù)的內(nèi)存泄漏會(huì)使程序性能下降到最終完全不能運(yùn)行,進(jìn)而影響到所有其它有動(dòng)態(tài)內(nèi)存需求的程序,在某些相對(duì)簡(jiǎn)單的嵌入式平臺(tái)上甚至?xí)恋K操作系統(tǒng)的運(yùn)轉(zhuǎn)。再如“寫(xiě)內(nèi)存越界”,一種不合法的寫(xiě)內(nèi)存操作,極可能破壞到本程序中正在使用的其它數(shù)據(jù),嚴(yán)重的時(shí)候還可能對(duì)其它正在運(yùn)行的程序甚至整個(gè)系統(tǒng)造成影響。為此,本文介紹一個(gè)增強(qiáng)的、可定制的動(dòng)態(tài)內(nèi)存管理模塊(以下不妨簡(jiǎn)稱Fense),在C語(yǔ)言提供的內(nèi)存分配函數(shù)基礎(chǔ)上,增加了對(duì)動(dòng)態(tài)內(nèi)存的管理功能;能記錄軟件運(yùn)行過(guò)程中出現(xiàn)的內(nèi)存泄漏信息,同時(shí)也具一定的監(jiān)測(cè)內(nèi)存操作的能力;可以發(fā)現(xiàn)絕大多數(shù)對(duì)動(dòng)態(tài)內(nèi)存的寫(xiě)越界錯(cuò)誤。
1 Fense的設(shè)計(jì)原理
Fense通過(guò)設(shè)立一個(gè)雙向鏈表(struct Head *stHead)來(lái)保存所有被分配的動(dòng)態(tài)內(nèi)存塊的信息。鏈表中的每個(gè)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)動(dòng)態(tài)內(nèi)存塊,節(jié)點(diǎn)中包括此內(nèi)存大小、分配發(fā)生時(shí)所在的源文件名和行號(hào)以及被釋放的時(shí)候,F(xiàn)ense又從st_Head中刪除之,檢查st_Head中的節(jié)點(diǎn)即可得到未被釋放的本節(jié)點(diǎn)的數(shù)值校驗(yàn)和等。Fense將每一個(gè)分配的動(dòng)態(tài)內(nèi)存塊插入到鏈表st_Head中;當(dāng)此內(nèi)存放內(nèi)存塊信息。鏈表節(jié)點(diǎn)結(jié)構(gòu)定義如下:
struct Head{
char file; /分配所在源文件名*/
unsigned long line; /*分配所在的行號(hào)*/
size_t size; /*分配的內(nèi)存大小*/
int checksum; /*鏈表節(jié)點(diǎn)校驗(yàn)和*/
struct Head prev,next; /*雙鏈表的前后節(jié)點(diǎn)指針*/
};
/*全局的雙向鏈表*/
struct Head *st_Head=NULL;
為了檢測(cè)寫(xiě)越界的錯(cuò)誤,F(xiàn)ense在用戶申請(qǐng)的內(nèi)存前后各增加了一定大小的內(nèi)存作為監(jiān)測(cè)區(qū)域,并初始化成預(yù)定值。這樣,當(dāng)程序發(fā)生越界寫(xiě)操作時(shí),預(yù)定值就會(huì)發(fā)生改變,F(xiàn)ense即可檢測(cè)到錯(cuò)誤。
通過(guò)Fense分配到的動(dòng)態(tài)內(nèi)存結(jié)構(gòu)如圖1所示。由此可知,F(xiàn)ense_Malloc(Fense的內(nèi)存分配函數(shù))返回給用戶的指針ptr指向的是用戶申請(qǐng)內(nèi)存區(qū)域的起始位置。鏈表節(jié)點(diǎn)、前/后監(jiān)測(cè)區(qū)域均為Fense內(nèi)部使用,是用戶不可見(jiàn)的。
2 用戶定制選項(xiàng)
Fense有5組宏定義提供給用戶對(duì)功能進(jìn)行定制。各組選項(xiàng)控制意義如下:
WARN_ON_ZERO_MALLOC 用戶申請(qǐng)零分配空間時(shí)警告信息。
FILL_ON_MALLOC 分配時(shí)初始化內(nèi)存塊
FILL_ON_MALLOC_VAL 分配初始化時(shí)的預(yù)設(shè)值
FILL_ON_FREE 釋放時(shí)填充內(nèi)存塊
FILL_ON_FREE_VAL 釋放時(shí)填充內(nèi)存塊的預(yù)設(shè)值
以上4個(gè)選項(xiàng)的主要功能是初始化剛分配
摘要:介紹一個(gè)動(dòng)態(tài)內(nèi)存管理模塊,可以有效地檢測(cè)C程序中內(nèi)存泄漏和寫(xiě)內(nèi)存越界等錯(cuò)誤,適用于具有標(biāo)準(zhǔn)C語(yǔ)言開(kāi)發(fā)環(huán)境的各種平臺(tái)。
關(guān)鍵詞:C語(yǔ)言 動(dòng)態(tài)內(nèi)存 內(nèi)存泄漏 寫(xiě)越界
引言
當(dāng)前,絕大多數(shù)嵌入式平臺(tái)上的軟件都采用C語(yǔ)言編寫(xiě)。除了代碼簡(jiǎn)潔、運(yùn)行高效之外,靈活操作內(nèi)存的能力更是C語(yǔ)言的重要特色。然而,不恰當(dāng)?shù)膬?nèi)存操作通常也是錯(cuò)誤的根源之一。如“內(nèi)存泄漏” ——不能正確地釋放已分配的動(dòng)態(tài)內(nèi)存,就是一種非常難于檢測(cè)的存錯(cuò)誤。持續(xù)的內(nèi)存泄漏會(huì)使程序性能下降到最終完全不能運(yùn)行,進(jìn)而影響到所有其它有動(dòng)態(tài)內(nèi)存需求的程序,在某些相對(duì)簡(jiǎn)單的嵌入式平臺(tái)上甚至?xí)恋K操作系統(tǒng)的運(yùn)轉(zhuǎn)。再如“寫(xiě)內(nèi)存越界”,一種不合法的寫(xiě)內(nèi)存操作,極可能破壞到本程序中正在使用的其它數(shù)據(jù),嚴(yán)重的時(shí)候還可能對(duì)其它正在運(yùn)行的程序甚至整個(gè)系統(tǒng)造成影響。為此,本文介紹一個(gè)增強(qiáng)的、可定制的動(dòng)態(tài)內(nèi)存管理模塊(以下不妨簡(jiǎn)稱Fense),在C語(yǔ)言提供的內(nèi)存分配函數(shù)基礎(chǔ)上,增加了對(duì)動(dòng)態(tài)內(nèi)存的管理功能;能記錄軟件運(yùn)行過(guò)程中出現(xiàn)的內(nèi)存泄漏信息,同時(shí)也具一定的監(jiān)測(cè)內(nèi)存操作的能力;可以發(fā)現(xiàn)絕大多數(shù)對(duì)動(dòng)態(tài)內(nèi)存的寫(xiě)越界錯(cuò)誤。
1 Fense的設(shè)計(jì)原理
Fense通過(guò)設(shè)立一個(gè)雙向鏈表(struct Head *stHead)來(lái)保存所有被分配的動(dòng)態(tài)內(nèi)存塊的信息。鏈表中的每個(gè)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)動(dòng)態(tài)內(nèi)存塊,節(jié)點(diǎn)中包括此內(nèi)存大小、分配發(fā)生時(shí)所在的源文件名和行號(hào)以及被釋放的時(shí)候,F(xiàn)ense又從st_Head中刪除之,檢查st_Head中的節(jié)點(diǎn)即可得到未被釋放的本節(jié)點(diǎn)的數(shù)值校驗(yàn)和等。Fense將每一個(gè)分配的動(dòng)態(tài)內(nèi)存塊插入到鏈表st_Head中;當(dāng)此內(nèi)存放內(nèi)存塊信息。鏈表節(jié)點(diǎn)結(jié)構(gòu)定義如下:
struct Head{
char file; /分配所在源文件名*/
unsigned long line; /*分配所在的行號(hào)*/
size_t size; /*分配的內(nèi)存大小*/
int checksum; /*鏈表節(jié)點(diǎn)校驗(yàn)和*/
struct Head prev,next; /*雙鏈表的前后節(jié)點(diǎn)指針*/
};
/*全局的雙向鏈表*/
struct Head *st_Head=NULL;
為了檢測(cè)寫(xiě)越界的錯(cuò)誤,F(xiàn)ense在用戶申請(qǐng)的內(nèi)存前后各增加了一定大小的內(nèi)存作為監(jiān)測(cè)區(qū)域,并初始化成預(yù)定值。這樣,當(dāng)程序發(fā)生越界寫(xiě)操作時(shí),預(yù)定值就會(huì)發(fā)生改變,F(xiàn)ense即可檢測(cè)到錯(cuò)誤。
通過(guò)Fense分配到的動(dòng)態(tài)內(nèi)存結(jié)構(gòu)如圖1所示。由此可知,F(xiàn)ense_Malloc(Fense的內(nèi)存分配函數(shù))返回給用戶的指針ptr指向的是用戶申請(qǐng)內(nèi)存區(qū)域的起始位置。鏈表節(jié)點(diǎn)、前/后監(jiān)測(cè)區(qū)域均為Fense內(nèi)部使用,是用戶不可見(jiàn)的。
2 用戶定制選項(xiàng)
Fense有5組宏定義提供給用戶對(duì)功能進(jìn)行定制。各組選項(xiàng)控制意義如下:
WARN_ON_ZERO_MALLOC 用戶申請(qǐng)零分配空間時(shí)警告信息。
FILL_ON_MALLOC 分配時(shí)初始化內(nèi)存塊
FILL_ON_MALLOC_VAL 分配初始化時(shí)的預(yù)設(shè)值
FILL_ON_FREE 釋放時(shí)填充內(nèi)存塊
FILL_ON_FREE_VAL 釋放時(shí)填充內(nèi)存塊的預(yù)設(shè)值
以上4個(gè)選項(xiàng)的主要功能是初始化剛分配
熱門(mén)點(diǎn)擊
- 基于Qt/Embedded的GUI移植及應(yīng)用
- 用Altera FLEX 10K可編程邏輯器
- EDA仿真技術(shù)在電子線路分析中的應(yīng)用
- 嵌入式電阻與電容
- 基于PSL語(yǔ)言的數(shù)字集成電路功能覆蓋率測(cè)試
- 用SignalTap嵌入邏輯分析儀驗(yàn)證PLD
- 利用MATLAB增強(qiáng)MAX+PLUS II的
- 基于VHDL語(yǔ)言的智能撥號(hào)報(bào)警器的設(shè)計(jì)
- 一種基于移位寄存器的CAM的Verilog
- 用FPGA技術(shù)實(shí)現(xiàn)模擬雷達(dá)信號(hào)
推薦技術(shù)資料
- 聲道前級(jí)設(shè)計(jì)特點(diǎn)
- 與通常的Hi-Fi前級(jí)不同,EP9307-CRZ這臺(tái)分... [詳細(xì)]
- 100V高頻半橋N-溝道功率MOSFET驅(qū)動(dòng)
- 集成高端和低端 FET 和驅(qū)動(dòng)
- 柵極驅(qū)動(dòng)單片半橋芯片MP869
- 數(shù)字恒定導(dǎo)通時(shí)間控制模式(COT)應(yīng)用探究
- 高效率 (CSP/QFN/BG
- IC 工藝、封裝技術(shù)、單片設(shè)
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動(dòng)IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計(jì)
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究