2010-11-15 31 views
6

我在CentOS 5.5計算機上運行c程序。該程序運行一個循環,一次又一次地執行測試,直到被告知由外部源停止。如何處理別人驅動程序的內存泄漏

根據需要,我正在使用一箇舊的驅動程序用於與我的測試系統進行通信的PCI卡。從CentOS 4.5升級到5.5後,我注意到我只能循環執行175次程序。那時程序停止時會出現分配堆內存的錯誤。每次程序循環並且系統內存耗盡時,我都可以觀看10到20 MB的內存塊。當我使用Cntrl-C退出程序時,內存立即被釋放。

我已經使用了Valgrind,它指示內存泄漏在舊驅動程序中。寫驅動程序的公司現在只支持Windows,並且他們在5年之內沒有升級驅動程序。

沒有源代碼有什麼辦法可以釋放驅動程序每次循環使用我的程序時使用的內存?

謝謝。

+0

驅動程序是否在用戶空間或內核空間中運行? – Novelocrat 2010-11-15 20:41:35

回答

0

呃!艱難的,...

可以編寫自己的內存管理,封裝本地操作系統管理,並鏈接到舊的驅動程序?我誠實不知道是否可以做到。

此外,您可以嘗試向編寫該驅動程序的公司解釋問題,並很好地詢問舊代碼。

好運氣=/

2

如果聲明通過循環內的驅動程序訪問測試系統,這個應該把它的範圍在每次迭代。

類似如下:

char readbuf[512]; 
for (int i = 0; i < countloops; i++) 
{ 
    int fd = open("/dev/com1", O_RDWR); 
    readbuf = read(fd, sizeof (readbuf)); 
    close (fd); 
} 
+0

你假設當FD關閉時釋放'泄漏'的內存。這可能並非如此。 – Novelocrat 2010-11-15 20:41:02

+2

從OP「當我使用Cntrl-C退出程序時,內存立即被釋放。」這會讓我相信內存在關閉時會被釋放。 – KevinDTimm 2010-11-15 20:51:34

1

創建一個新的過程爲每個N使用的驅動程序的(〜175應該工作),並且經由任何種類的IPC的與父進程進行通信。

2

這是可能即使Valgrind在驅動程序代碼中顯示泄漏分配,問題仍在您的代碼中。例如,如果驅動程序提供了一個「免費」或「釋放」類型的函數,並且您希望程序調用,您就不會這樣做。

0

驅動程序是作爲一個獨立組件提供嗎?還是它是鏈接到CRT的庫?如果後者 - 也就是說,如果它希望鏈接到malloc()而不是提供自己的 - 你可以通過強制它鏈接到你自己的實現來覆蓋它所使用的malloc()。一旦完成,你就可以控制它的堆,你可以「重新啓動」驅動程序而不必殺死進程。

這正是我們處理某些泄漏的第三方庫,我們需要鏈接到消費者產品。