[發(fā)明專利]一種用于linux環(huán)境中的內(nèi)存池調(diào)試方法在審
| 申請?zhí)枺?/td> | 201710617729.7 | 申請日: | 2017-07-26 |
| 公開(公告)號: | CN107451054A | 公開(公告)日: | 2017-12-08 |
| 發(fā)明(設(shè)計)人: | 王鑫鵬;倪創(chuàng);陶琴;陳輝 | 申請(專利權(quán))人: | 武漢虹信通信技術(shù)有限責(zé)任公司 |
| 主分類號: | G06F11/36 | 分類號: | G06F11/36;G06F12/02 |
| 代理公司: | 武漢科皓知識產(chǎn)權(quán)代理事務(wù)所(特殊普通合伙)42222 | 代理人: | 嚴(yán)彥 |
| 地址: | 430073 湖北省*** | 國省代碼: | 湖北;42 |
| 權(quán)利要求書: | 查看更多 | 說明書: | 查看更多 |
| 摘要: | |||
| 搜索關(guān)鍵詞: | 一種 用于 linux 環(huán)境 中的 內(nèi)存 調(diào)試 方法 | ||
技術(shù)領(lǐng)域
本發(fā)明涉及一種基于Linux系統(tǒng)的內(nèi)存池的調(diào)試方法,可用于調(diào)試內(nèi)存泄漏,內(nèi)存double free(重復(fù)釋放)等內(nèi)存使用不當(dāng)相關(guān)的bug(錯誤)。
背景技術(shù)
在大型程序中,由于代碼量很大和邏輯復(fù)雜,如果動態(tài)申請的內(nèi)存是直接使用系統(tǒng)接口,那么出現(xiàn)了內(nèi)存泄漏或者double free(重復(fù)釋放)會非常難于排查,通常排查此類問題的方法包括:
1.閱讀代碼,效率低,方法不系統(tǒng),依賴于解決bug的人的能力和靈感;
2.在代碼中增加log(打印),需要重新復(fù)現(xiàn)問題,效率低。
3.使用valgrind等類似的開源工具,需要重新編譯和復(fù)現(xiàn)問題,不能通過出現(xiàn)問題的現(xiàn)場直接定位問題。
這些方法效率都很低,且不能通過出現(xiàn)問題的場景直接定位問題,需要重新復(fù)現(xiàn)問題才能排查,不適合在商業(yè)產(chǎn)品中使用。
發(fā)明內(nèi)容
針對現(xiàn)有技術(shù)缺陷,本發(fā)明提供了一種新的用于linux環(huán)境中使用內(nèi)存池來快速定位內(nèi)存使用不當(dāng)?shù)腷ug的方法。
本發(fā)明的技術(shù)方案提出一種用于linux環(huán)境中的內(nèi)存池調(diào)試方法,用內(nèi)存池來管理動態(tài)申請的內(nèi)存,在內(nèi)存塊的管理結(jié)構(gòu)中存儲debug信息,實現(xiàn)方式如下,
在程序啟動時,將進(jìn)程的虛擬地址映射表輸出到一個文件里保存,用于函數(shù)調(diào)用棧地址和代碼位置的轉(zhuǎn)換;
之后創(chuàng)建和初始化內(nèi)存池,內(nèi)存池里的內(nèi)存按業(yè)務(wù)需求分成不同大小的內(nèi)存塊,每個內(nèi)存塊都有一個管理結(jié)構(gòu)用于內(nèi)存池對內(nèi)存塊進(jìn)行管理,管理結(jié)構(gòu)對用戶不可見;內(nèi)存塊的管理結(jié)構(gòu)內(nèi)有鏈表結(jié)構(gòu),用于將同類型的同狀態(tài)內(nèi)存塊連接起來,大小相同的狀態(tài)相同的內(nèi)存塊在一個鏈表中;
申請內(nèi)存時,從內(nèi)存池中取相應(yīng)大小的內(nèi)存塊返回給用戶,并在內(nèi)存塊的管理結(jié)構(gòu)中存儲申請時的函數(shù)調(diào)用棧地址;釋放內(nèi)存時,將要釋放的內(nèi)存塊返回給內(nèi)存池,并在內(nèi)存塊的管理結(jié)構(gòu)中存儲釋放時的函數(shù)調(diào)用棧地址;
出現(xiàn)問題時,將存儲的函數(shù)調(diào)用棧地址轉(zhuǎn)換成代碼位置,支持直接定位bug出現(xiàn)的代碼位置。
而且,內(nèi)存塊的管理結(jié)構(gòu)內(nèi)有標(biāo)記表明此內(nèi)存塊是inuse或free的狀態(tài),如果對一個free的內(nèi)存塊進(jìn)行釋放操作,就是double free狀態(tài);inuse表示被申請狀態(tài),free表示空閑未被申請的狀態(tài),double free表示重復(fù)釋放狀態(tài)。
而且,申請內(nèi)存時是從對應(yīng)大小的空閑內(nèi)存塊鏈表free list里取一個內(nèi)存塊返回給用戶使用,同時放置到對應(yīng)大小的被分配內(nèi)存塊鏈表inuse list中。
而且,內(nèi)存池里的內(nèi)存塊被創(chuàng)建出來后,不能被銷毀,內(nèi)存的申請和釋放只是將內(nèi)存塊在內(nèi)存池的不同鏈表間轉(zhuǎn)換,支持保留內(nèi)存塊管理結(jié)構(gòu)內(nèi)存儲的debug信息。
而且,記錄函數(shù)調(diào)用棧地址是調(diào)用__builtin_return_address(n),此調(diào)用返回一個int的整數(shù),作為棧地址存儲到內(nèi)存塊的管理結(jié)構(gòu)中;其中n表示棧的層數(shù),調(diào)用__builtin_return_address(n)表示返回第n層的棧地址。
而且,將函數(shù)調(diào)用棧地址還原為代碼位置是使用linux的工具addr2line和之前記錄的虛擬地址映射表。
本發(fā)明所提供方法可以直接檢測出double free的內(nèi)存申請和2次釋放的代碼位置,精確定位問題;對于內(nèi)存泄漏,遍歷內(nèi)存塊的inuse list,計算出每個內(nèi)存塊的申請的代碼位置,結(jié)合代碼可以直接查出內(nèi)存泄漏點。該方法能在linux系統(tǒng)中實現(xiàn)快速定位double free和內(nèi)存泄漏的bug。
本發(fā)明對比已有技術(shù)有以下創(chuàng)新點:
1、使用內(nèi)存池來管理內(nèi)存,在內(nèi)存塊中標(biāo)記狀態(tài),以及將狀態(tài)相同的同級別的內(nèi)存塊放到同一個鏈表中,可以快速的定位double free和內(nèi)存泄漏的bug。
2、進(jìn)一步地,在申請和釋放內(nèi)存時通過linux系統(tǒng)調(diào)用__builtin_return_address獲取函數(shù)棧地址并存儲到內(nèi)存塊中,出現(xiàn)問題時再通過addr2line命令將存儲的函數(shù)棧地址轉(zhuǎn)換成代碼行數(shù),可以直接定位bug出現(xiàn)的代碼位置。
本發(fā)明技術(shù)方案將在大型linux服務(wù)程序中發(fā)揮重要作用,具有重大的市場價值。
附圖說明
圖1為本發(fā)明實施例的流程圖。
具體實施方式
以下結(jié)合附圖和實施例詳細(xì)說明本發(fā)明技術(shù)方案,提供了對該實施例的全面理解的詳細(xì)細(xì)節(jié)。
該專利技術(shù)資料僅供研究查看技術(shù)是否侵權(quán)等信息,商用須獲得專利權(quán)人授權(quán)。該專利全部權(quán)利屬于武漢虹信通信技術(shù)有限責(zé)任公司,未經(jīng)武漢虹信通信技術(shù)有限責(zé)任公司許可,擅自商用是侵權(quán)行為。如果您想購買此專利、獲得商業(yè)授權(quán)和技術(shù)合作,請聯(lián)系【客服】
本文鏈接:http://www.szxzyx.cn/pat/books/201710617729.7/2.html,轉(zhuǎn)載請聲明來源鉆瓜專利網(wǎng)。
- 環(huán)境服務(wù)系統(tǒng)以及環(huán)境服務(wù)事業(yè)
- 環(huán)境控制裝置、環(huán)境控制方法、環(huán)境控制程序及環(huán)境控制系統(tǒng)
- 環(huán)境檢測終端和環(huán)境檢測系統(tǒng)
- 環(huán)境調(diào)整系統(tǒng)、環(huán)境調(diào)整方法及環(huán)境調(diào)整程序
- 環(huán)境估計裝置和環(huán)境估計方法
- 用于環(huán)境艙的環(huán)境控制系統(tǒng)及環(huán)境艙
- 車輛環(huán)境的環(huán)境數(shù)據(jù)處理
- 環(huán)境取樣動力頭、環(huán)境取樣方法
- 環(huán)境艙環(huán)境控制系統(tǒng)
- 環(huán)境檢測儀(環(huán)境貓)





