我在调试内存泄漏。我想定位导致内存泄漏的实际代码行。我在互联网上搜索开源工具,发现我用FullDebugMode
和LogMemoryLeakDetailToFile
设置了FastMM。我得到了以下日志文本文件:内存块已泄漏。尺寸为:56
This block was allocated by thread 0x3840, and the stack trace (return addresses) at the time was:
424559 [FastMM4.pas][FastMM4][_ZN7Fastmm411DebugGetMemEx][9659]
4248F6 [FastMM4.pas][FastMM4][_ZN7Fastmm415DebugReallocMemEPvx][9878]
40938D [System.pas][System][_ZN6System11_ReallocMemERPvx][4819]
412C9C [System.pas][System][_ZN6System17DynArraySetLengthERPvS0_xPx][35000]
4623F1 [System.Generics.Collections.pas][System.Generics.Collections][_ZN6System8Generics11Collections11TListHelperE@InternalSetCapacity][3845]
460BD6 [System.Generics.Collections.pas][System.Generics.Collections][_ZN6System8Generics11Collections11TListHelperE@InternalGrow][3106]
460C0D [System.Generics.Collections.pas][System.Generics.Collections][_ZN6System8Generics11Collections11TListHelperE@InternalGrowCheck][3112]
45F243 [System.Generics.Collections.pas][System.Generics.Collections][_ZN6System8Generics11Collections11TListHelperE@InternalAdd8][2487]
6EF13D [System.JSON.pas][System.JSON][_ZN6System4Json11TJSONObjectE@AddDescendant][1831]
6EF64E [System.JSON.pas][System.JSON][_ZN6System4Json11TJSONObjectE@ParsePair][1979]
6EF4BB [System.JSON.pas][System.JSON][_ZN6System4Json11TJSONObjectE@Parse][1924]
The block is currently used for an object of class: Unknown
所以它只在发生任何内存泄漏时通知。我不明白如何使用这个文件,并找到导致内存的实际代码行。有什么办法能很容易找到吗?
3条答案
按热度按时间62o28rlo1#
要查找内存泄漏,madExcept确实是一个很好的工具。它非常容易使用,不需要对源代码进行任何修改。
一旦安装在 Delphi 中,您将在“Project”下有一个新的“madExcept settings...”菜单项,该菜单项给出了以下屏幕:
在那个屏幕转储中,我已经检查了正确的选项来检测内存泄漏以及其他事情。
只需编译和运行你的程序。当您退出它时,它将生成一个错误报告。例如,假设你有这个源代码,它在第28行创建了内存泄漏:
生成以下报告:
报告显示有一个内存泄漏。泄漏是一个TObject示例,发生在程序启动后2.47秒。调用堆栈显示GetMem已被调用,但没有相应的FreeMem。如果您跟踪调用堆栈,您可以看到第28行的TForm10.Button1Click是我编写的代码中的罪魁祸首。
madExcept报告的内存泄漏不止:它还报告资源泄漏、缓冲区溢出或下溢以及冻结主线程。
cotxawn72#
我使用MadExcept工具已经取得了一些成功,尽管当我打开泄漏检测时,它也阻止了我运行一些项目。
xnifntxz3#
如果你正在寻找一个免费的替代madExcept(免费软件),那么你可以使用
delphi-leakcheck
。它帮助我很容易地跟踪内存泄漏的来源。
https://stackoverflow.com/a/76539120/9134997