一個舊專案落到了我的手中。它有 130000 行非常糟糕的代碼(沒有嘗試/最終吞下所有例外,數千個全域變數)。我預計會有成千上萬的記憶體泄漏。但是,FastMM4 在關機時沒有顯示任何內容。沒有訊息框,沒有 txt 日志檔案。
我對所有其他專案使用相同的 FastMM 設定(inc),它可以作業。所以,我并不是說 FastMM(或其設定)被破壞了。我認為無法處理如此令人印象深刻的泄漏量。我的一個朋友告訴我,在一個也有很多泄漏的大型專案上,FastMM 需要 5-10 分鐘才能生成 txt 日志。
驗證:
- FastMM 在 DPR 的第一行宣告。
- 我手動創建了一行代碼來生成泄漏。
- EnableMemoryLeakReporting 已定義(參見下面的串列)
- 我處于除錯模式(地圖檔案生成設定為“詳細”)
有關如何獲取日志的任何提示?
{$define UseCustomFixedSizeMoveRoutines}
{$define UseCustomVariableSizeMoveRoutines}
{$define NoDebugInfo}
{$define ASMVersion}
{$define CheckHeapForCorruption}
{$define DetectMMOperationsAfterUninstall}
{$define FullDebugMode}
{$define RawStackTraces}
{$define LogErrorsToFile}
{$define LogMemoryLeakDetailToFile}
{$define ClearLogFileOnStartup}
{$define LoadDebugDLLDynamically}
{$define AlwaysAllocateTopDown}
{$define SuppressFreeMemErrorsInsideException}
{$define EnableMemoryLeakReporting}
{$define HideExpectedLeaksRegisteredByPointer}
{$define RequireDebuggerPresenceForLeakReporting}
{$define EnableMemoryLeakReportingUsesQualifiedClassName}
{$define EnableMMX}
{$define ForceMMX}


uj5u.com熱心網友回復:
我不明白ini您在談論哪個設定和檔案。FastMM4 選項由編譯器條件 IIRC 驅動。
默認情況下不跟蹤記憶體泄漏。
您需要在EnableMemoryLeakReporting顯式啟用條件的情況下編譯專案。
可能LogMemoryLeakDetailToFile還有FullDebugMode條件。FastMM_FullDebugMode.dll可執行檔案夾中的和庫FastMM_FullDebugMode64.dll,具體取決于您的目標平臺。
如果您需要堆疊跟蹤的行號,請在專案選項中將“映射檔案生成”級別啟用為“詳細”。
請參閱本文和其他類似的文章作為參考。
uj5u.com熱心網友回復:
我找到了原因:寫代碼的人KillTask用來終止程式(后面跟著Application.Terminate)。
我洗掉了該代碼。現在 FastMM 生成 12MB 的日志檔案!我必須修復它們。幸運的我!
個人想法:當我得到解決方案時,我很傷心,我想也許這不應該是 StackOverflow 的帖子。轉念一想,還好。我們今天學到了一些東西:如何不撰寫程式 :)
此外,我們了解到瘋狂的程式員可以通過無數種神奇的方式破壞程式,我們將花費數天時間來弄清楚我們的瘋狂方式。
(在我的語言中,我們有一句話:“瘋子往湖里扔石頭,10個聰明人都取不回來”,意思是做傻事很容易,很難改正。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/503923.html
上一篇:如果您交換cntCaseTbl(Z:Int64):Int64;則下限超過上限&重復大小寫標簽;案例表中的錯誤
下一篇:比較浮點數和小整數
