我參與了各種C++項目(主要使用MSVC6到MSVC10),其中我們最近發現了一些句柄泄漏(由CreateThread
函數給出的線程句柄)。我懷疑還有很多其他的手柄正在泄漏,我想集成一個測試來驗證沒有把手泄漏到我們的夜間測試結果中。是否有可連接到現有應用中的手柄泄漏檢測器?
我的想法是開發一個DLL,它可以檢測相關的kernel32.dll函數(CreateThread,OpenProcess,CreateProcess和其他一些函數)以及CloseHandle
函數。然後,對於獲取的每個句柄,DLL將記住一個回溯。在該過程結束時,DLL會打印所有未關閉的句柄的反向跟蹤,然後由測試框架解析該日誌文件。
這當然也會產生所有仍然可以訪問的句柄的回溯(因此從技術上說,它們沒有泄漏 - 也許作者希望操作系統在進程終止時回收它們),但是我猜測明確地關閉它們並不會,不會受到傷害 - 尤其是因爲我們已經有了一些不錯的RAII這種東西的包裝,我們只是不會像我們應該那樣使用它。
現在我想知道 - 這看起來像一個相當簡單的方法;也許這裏的某個人意識到圖書館已經這樣做了?
應用程序驗證似乎相當不錯!可惜我似乎無法得到它產生任何有用的結果。即使是在測試情況下的應用程序,明確泄漏的句柄,它永遠不會fidns任何錯誤或警告(即使我運行'ntsd'調試器下的應用程序): -/ –
你確定你hav它配置正確嗎?也許嘗試測試內存泄漏來檢查。我不熟悉'ntsd',但我認爲它只適用於JIT調試。也許嘗試用'windbg'或Visual Studio的調試器來運行你的應用程序。 –
對於應用程序驗證程序的第一步,您應該閱讀:http://geekswithblogs.net/akraus1/archive/2010/06/25/140610.aspx –