在頻繁呼叫的底層函式中使用malloc的影響分析

2021-06-18 17:14:24 字數 882 閱讀 1179

近來,測試中發現乙個問題,ipcam會自動重啟。經過定位,是增加了乙個外部i2c timer作為看門狗引起的。

看了ex-wdt keep alive的code後發現,呼叫了乙個i2c_writebytes()函式,這個func中呼叫了兩次malloc申請記憶體,並且,對malloc分配的

指標未作null的檢查。我認為問題就出在這裡,原因是這樣:

1、雖然在這個func中,malloc與free是配對使用的,但是,在乙個多工的環境中,這個func可能被搶占,也就是說,先malloc後,接著是

其它程序去malloc,因此,malloc申請小的記憶體,仍然可能導致碎片化及整理記憶體的開銷日益增大。這與測試中發現的現象可以吻合。

首先,測試中發現ipcam在重啟前變得越來越慢,這是整理記憶體開銷越來越大導致的,malloc/free執行時間會變得很長。其次,用兩個程序來

keep ex-wdt alive,結果ipcam重啟變得更頻繁了,一晚上16台有6臺重啟。這是因為呼叫i2c_writebytes()函式變得更加頻繁,壓力之下加

速了該問題的發生。

2、對malloc申請的指標不作檢查,如果不幸申請到null指標直接使用,同時有送進核心使用。這必然導致linux kernel crash,進而導致

watchdog復位。

針對上面的分析,可以用下面的方法進行驗證:

1、壓力測試:每秒feed一次ex-wdt,啟動n個(n=10)程序來keep ex-wdt alive。其它程序仍然全部啟動。

預期結果:幾小時內出現cpu佔用率不斷公升高,然後核心crash,進而watchdog復位。

2、對比測試:驅動函式取消malloc/free,同樣進行壓力測試。

預期結果:cpu佔用率不會持續公升高,核心不會crash並導致watchdog復位。

函式呼叫的底層機制

int fun int a,int b int main 之後,最關鍵的是在專案設定裡關閉優化功能。也就是把project setting c c optimizations選為disabled。編譯器的優化在分析底層實現時大多數情況不太受歡迎。按鍵盤上的f10鍵,進入單步除錯模式 step ove...

函式呼叫的底層機制

int fun int a,int b int main 之後,最關鍵的是在專案設定裡關閉優化功能。也就是把project setting c c optimizations選為disabled。編譯器的優化在分析底層實現時大多數情況不太受歡迎。按鍵盤上的f10鍵,進入單步除錯模式 step ove...

在linux中使用getch 函式

由於在linux中沒有conio.h檔案,所以不能直接用getch 函式,下面介紹如何在linux中使用getch 函式 在linux中並沒有 conio.h 這個檔案,要實現類似 getch getche 等函式的功能,可以使用 curses庫。include 使用 curses 之前要先進行初始...