2009-08-19 82 views
2

當您使用某種「工具」(例如WinDbg,GlowCode或甚至整合的Visual C++泄漏記者)查找內存泄漏時,可以報告哪些類型的誤報?可以報告哪些類型的假陽性內存泄漏?

事實上,GlowCode會提醒您防止誤報。根據您運行的掃描類型,可能會出現更多誤報。

帶着這個問題,我想弄清楚的事情怎麼樣GlowCode掃描儀比較的WinDbg的!heap -l ...

我會感激任何提示您可以提供!

UPDATE:如果你能給一些C 真正例如++(或您的首選語言),這將有很大的幫助。

回答

1

內存調試器的一般方法是在程序退出時報告所有分配的內存。這個內存可能會被泄漏,但它可能只是爲應用程序的整個生命週期分配的內存,並且從未明確釋放(本身是一個有問題的編程習慣)。

其他工具(例如靜態分析器)嘗試匹配分配/釋放調用或某些編程模式。例如,MS prefast工具會警告您,如果您分配內存並調用可能會在沒有try塊的情況下拋出異常的函數。一種情況是這種情況是誤報,其中分配的對象在父對象被銷燬時會自動刪除。

1

有兩種內存通過泄漏檢測器報告:

  • 存儲器,它是沒有更多的可到達的(即沒有辦法讓從全局變量指針它們)。如果您玩技巧來隱藏值指針,那麼在這裏可能會出現誤判(從內存實際上仍然可以到達的意義上說)。其中一些是符合的,一些在實踐中有效,但不是。他們往往是可疑的性質,但在記憶緊張的情況下工作時可以來得方便。自從我在嵌入式8位系統中工作以來,我一直沒有使用它們。這些通常在代碼庫中很少見。

  • 內存在程序結束時仍然可以訪問但尚未釋放。這種可以被稱爲「誤報」。這個用法是風格問題;人們可能會質疑在退出程序時不刪除對象的做法的可靠性,因爲人們可能會質疑做出不可觀察的工作的效用,只要運行時被忽略,這種效果是不可觀測的。請注意,有時它是故意完成的,以便可以在程序退出時調用的靜態析構函數中使用該對象。

+0

尋找內存泄漏的工具在執行期間如何? – 2009-08-20 10:45:01

+0

在執行過程中,報告可訪問的內存(除了提供分配統計信息)沒有多大意義,因此它們報告無法訪問的內存。 – AProgrammer 2009-08-20 11:41:10

+0

當然,我正在談論_unreachable_內存......這就是你所說的內存泄漏,不是嗎? – 2009-08-20 12:26:51

1

假設您已經在地址A和地址B分配了內存並將這些值保存到相應的指針。然後,分別用(A + B)和(A-B)替換A和B的值。

如何在世界中應該檢查器猜測內存仍然可以訪問?你真的可以恢復原來的指針值,也許你真的在某個地方。但它應該如何猜測?如果你用三角函數或RSA來改變這些值? :)

還有一件事。您聽起來像是更多的誤報意味着更糟糕的工具。但是,一般來說,當假陽性數量增加時,假陰性數量會減少。這就像是成爲一個更可疑的偵探,抓住一個難以捉摸的罪犯,但同時劫持更多無辜的人。

+0

我不想評判任何工具,我只想了解一些應用程序如何設法避免誤報,如果你讓他們有更多的處理時間這樣做。 謝謝你的回答! – 2009-08-21 06:39:40

+0

作爲一個簡單的例子,一些跳棋可以讓你打開和關閉流敏感別名分析。簡單看看你的代碼告訴我們,在free(x)中,x可能指向a和b內存區域,因爲代碼如下所示: x = a; ... x = b; ... free(b); free(x); 哇,你的程序_may_可以釋放b兩次,檢查員說,並報告錯誤。 但是,如果檢查人員花更多時間查看代碼,他可能會注意到它實際上看起來像這樣: x = a;如果(2 * 2 == 5) x = b; ... free(b); free(x); 然後它會報告沒有錯誤。 – 2009-08-22 10:56:46