2008-09-20 129 views
22

我的C應用程序使用第三個庫,它們自己進行內存管理。 爲了強健,我的應用程序有代碼來處理由於缺乏可用內存而導致的庫函數故障。如何模擬內存分配錯誤

我想測試這段代碼,爲此,我需要模擬由於內存不足而導致的故障。

推薦使用什麼工具? 我的環境是Linux/gcc。

+0

另請參閱http://stackoverflow.com/questions/1229241/how-do-i-force-a-program-to-appear-to-run-out-of-memory/1232235 – 2009-08-05 09:55:02

回答

13

創建您自己的malloc包裝,它將隨機返回null而不是有效的指針。那麼,或者如果你想要進行單元測試,那麼一直會失敗。

+0

而且`calloc` ,`realloc`,`strdup`和代碼使用的其他內存分配函數。並且您希望在構建發佈時關閉此功能。 – 2015-06-10 19:52:13

4

您可以使用與第三方庫相同的界面編寫自己的模擬庫,而不是使用它。您也可以使用LD_PRELOAD來覆蓋第三方庫的選定功能。

3

我可以給Linux(也許是POSIX)特定版本:__malloc_hook,__realloc_hook,__free_hook。這些是在malloc.h中聲明的。編輯:有一點細節:這些是函數指針(請參閱malloc.h和他們的精確聲明的手冊頁),但要小心:這些不完全是標準,只是GNU擴展。所以如果可移植性是一個問題,請不要使用它。

稍微取決於平臺的解決方案可能是您聲明瞭malloc宏。如果你正在測試,這會調用一個鉤子和真正的malloc。

memhook.h:

#define malloc(s) (my_malloc(s)) 

memhook.c:

#include "memhook.h" 
#undef malloc 
#include <stdlib.h> 

您可以用它來檢測泄漏,隨機失敗的分配等

+1

malloc宏不會模擬第三方庫中的失敗 - 它們已經通過調用原始malloc進行編譯。不過,LD_PRELOAD會有所幫助。 – 2008-09-20 19:28:49

22

您可以使用ulimit限制用戶可以使用的資源數量,包括內存。所以你創建一個測試用戶,限制其內存使用的東西剛好足以讓你的程序,並看着它死了:)

例子:

ulimit -m 64 

設置64KB的內存限制。

0

你想在bash中使用ulimit命令。在bash shell提示下嘗試

help ulimit

+0

我不是西部最快的槍。甚至esat,它會出現。 – jfm3 2008-09-20 19:03:21

1

此外,你應該使用Valgrind來測試這一切,並獲得有關程序

+1

子工具被稱爲地塊。地塊是一個堆探查器。它測量你的程序使用多少堆內存。它會生成一個日誌和一個postscript(.ps)圖表。 – 2008-09-30 01:22:36

0

的記憶行爲真正有用的報告(作爲補充,以前的一些答案)

結帳「電子圍欄」一個malloc攔截庫的例子,你可以使用你的可執行文件(例如使用LD_PRELOAD技巧)。

一旦你截獲了malloc,你可以使用任何你想觸發失敗的東西。隨機觸發的失敗對於系統的各個部分來說是一個很好的壓力測試。您也可以根據請求的內存量修改故障概率。

你的是一個有趣的想法,順便說一句,顯然這是我想對我的一些代碼,做...

7

在那個過量使用內存的操作系統(例如Linux或Windows),它根本不可能處理內存不足的錯誤。 malloc可能會返回一個有效的指針,然後當您試圖對其進行解引用時,您的操作系統可能會確定您內存不足並終止進程。

http://www.reddit.com/comments/60vys/how_not_to_write_a_shared_library/對此是一個很好的說明。

+0

這種行爲最近導致了我的項目嚴重的痛苦。 man malloc並在BUGS標題下查找。 echo/proc/sys/vm/overcommit_memory 如果是2,則過量使用關閉。 – 2008-09-30 01:26:04

+0

這個答案錯了​​。過度使用很容易被禁用,而其他因素(如ulimit或整個虛擬地址空間的耗盡)也會導致分配失敗。 – 2012-02-06 00:03:49

0

您可能需要查看一些面向恢復的計算站點,例如Berkeley/Stanford ROC group。我聽說過其中一些人在談論之前,他們使用代碼在C運行時中隨機注入錯誤。他們的頁面底部有一個鏈接到他們的FIT工具。