2016-11-15 35 views
1

有一個擁有數十萬C#行的大型商業WPF應用程序。我最近被分配給它。該應用程序還使用(最新版本的)第三方組件(知名的第三方組件提供商,我不想列出它們)。Windows 10上的WPF應用程序中的內存泄漏

內存泄漏只發生在某些合作伙伴。他們在早上啓動應用程序,並在完全吃完內存之前使用它幾個小時,最終變得非常慢,以至於不得不重新啓動它(每天幾次)。他們有Windows 10機器(但這可能沒有意義)。我無法重現我身邊的泄漏。

合作伙伴允許我發佈特殊版本的應用程序,但不允許使用Memory Profiler(他們希望使用該應用程序進行製作,並且所連接的Profiler會降低速度)。所以我的想法是:讓我們發佈一個特殊版本,記錄所有內容,包括用戶點擊和處理「可疑」GC根。正如我所說,我不知道我必須調試的代碼,所以我用內存分析器識別了可能泄漏的GC根。 (是的,我列出了可能的罪魁禍首,如依賴屬性,靜態列表等,但目前還沒有運氣。正如我所說的,我不太瞭解源代碼,但我可以訪問它,可以修改它的任何部分。)

我實際上正在編寫一個編程問題:除了用戶行爲和訪問靜態變量之外,還應該記錄什麼?也許我應該在每次用戶操作後記錄空閒內存。什麼是適合.NET的方法?

合作伙伴在重新啓動應用程序之前會複製併發送日誌文件。

+0

我發貨我用[dotTrace的 「自我分析」 API]申請(https://www.jetbrains.com/help/profiler/2016.2/Profiling_Guidelines__Advanced_Profiling_Using_dotTrace_API.html)。用戶可以設置複選框來啓用/禁用性能分析。似乎只有_performance_分析,而不是_memory_分析。 –

+0

我認爲最好的辦法不是記錄所有內容,而是在應用程序變慢時收集內存轉儲。然後讓客戶端將該內存轉儲傳遞給您並進行分析。 – Evk

+0

@Evk:有沒有API方法?這些合作伙伴並不是真正的IT人員,他們希望在進行「分析」或日誌記錄的同時,使用應用程序正常工作。所以他們可以找到日誌txt文件,但不能創建轉儲。他們也不想叫我來創建一個內存轉儲。 (其他問題:應用程序的某些部分寫得不太好,所以內存有時會在我自己的測試中增長很多,但是過了幾分鐘後,出現了一個大的GC,一切都恢復正常,不在他們的機器上......) –

回答

6

我想在此突出幾點讓您選擇正確的曲目。

  1. 如果有內存泄漏的可能性很小,這是Windows 10特定的 問題。您應該能夠在您的 開發PC中重現相同的問題。

  2. 通過編寫 日誌,內存泄漏(及其原因)不容易跟蹤。你需要知道什麼確實持有這種不斷增長的實例。

  3. 我會在本地(在您的開發電腦中)使用正確的內存分析工具(例如:ANTS Memory profiler)並嘗試重現 問題。

你不需要很好的理解代碼庫來檢測內存泄漏。檢測泄漏並找到根本原因是這裏80%的任務。如果你知道什麼物體在增長,什麼物體在它上面,它可能不是那麼難以修復它。

基本上你需要做的是。

  • 獲取一個好的內存分析器(您可以使用試用版)。
  • 找到您的客戶經常使用的區域/功能。
  • 運行應用程序並獲取基本內存快照。
  • 幾次執行相同的功能並拍攝另一個內存快照。將快照與基礎快照進行比較,查看內存中是否有任何增長的實例。你應該能夠看到物體保持圖,它顯示瞭如果有任何物體保持在那些生長的實例上。
  • 當您進行內存快照時,通常會執行內存分析器 GC.收集並清除內存中所有不必要的實例。因此,爲了測試應用程序是否存在內存泄漏,您不需要進行任何代碼更改。
  • 一次測試一個功能。
+0

1)很高興知道。許多合作伙伴都使用這種方式,泄漏只發生在幾個似乎擁有Win10的合作伙伴身上。他們使用該應用程序與其他應用程序相同的功能。但我同意。他們遇到泄漏可能是因爲他們更密集地使用了相同的功能(並且泄漏也可能出現在其他人身上,他們只是沒有注意到)。 2)我明白了。實際上,日誌將有助於重現客戶的實際行爲。從他們的屏幕錄像中,我試圖重現它,但似乎沒有發生明顯的泄漏。儘管如此,我會用匿名保留圖更新我的初始帖子。 –