如果应用程序作为服务运行, FastMM4 for Delphi 提供的用于将内存泄漏报告到详细文件的相同技术是否有效?当然,最好的做法是先编写单元测试和一个简单的独立应用程序,然后在服务环境之外找到那里的漏洞。
5 回答
正如 Lars Truijens 所说,写入日志文件需要文件系统权限。默认本地系统帐户(即当您没有明确设置帐户或在代码中登录时)对本地文件系统具有完全访问权限,但没有默认网络访问权限。
FWIW - 我通常将我的服务开发为常规的 Windows 应用程序,直到逻辑的主要部分启动并运行且稳定。使用像 SvCom 这样的库,您可以将服务作为常规桌面应用程序或作为服务运行,而无需更改任何代码。
是的,前提是用于运行服务的帐户有足够的权限来写入日志文件。
我现在也面临着同样的挑战。我试过这个,但它不起作用,至少对我来说是这样。该帐户有足够的权限,因为该服务可以编写他自己的专有日志文件。我已打开 FullDebugMode 并添加了 dll,我已通过 IDE 选项打开了 LogMemoryLeakDetailToFile。在代码中,我看到编译器看到了正确的区域,例如,当我引发错误时,编译器会报告它。我也无法调试 FastMM 代码。如果我放一个断点,它将被忽略。我已经搜索了该报告可能会到达的所有本地硬盘,但找不到。我从“管理服务”启动和停止服务,一切顺利,它启动了,但没有报告。如果我对普通的可执行文件做同样的事情,一切顺利。我正在使用 FastMM478 和 Delphi2007。
马克
好的,我发现了有时您看不到任何输出、日志文件或消息框的另一个原因......
如果您没有犯任何错误,则不会创建任何输出。
因此,要测试 FASTMM478 是否可以在您的程序中故意出错,例如:
//创建和不销毁 testToMakeError := TStringList.Create; 对于 I := 0 到 100 做 testToMakeError.Add('foobar');
我只是假设我会在某个地方犯一些错误,并花一天时间试图找出程序没有给我任何反馈的原因。
马克
- 按照 FastMM 自述文件中的说明进行操作
- 在 FastMM4Options.inc 文件中启用 {.$define NoMessageBoxes}
- 在 FastMM4Options.inc 文件中禁用 {$define RequireDebuggerPresenceForLeakReporting}
- 安装/启动服务,停止服务后,您将在输出文件夹中获得 MyApp_MemoryManager_EventLog 文件。