【问题标题】:Multithreaded 64 bit process goes "Out of memory"多线程 64 位进程“内存不足”
【发布时间】:2014-06-30 22:08:24
【问题描述】:

我有内存和 CPU 密集型应用程序,它运行数百个执行文本处理的并发线程。后台有很多事情要做,处理文件,记录到磁盘等等。应用程序是为 x64 平台编译的,在 XE2 下。

有时,它会崩溃,我已经尝试调试此问题几天,但没有成功。这是错误报告:http://pastebin.com/raw.php?i=sSUXCznT

我尝试在调试器下运行它,但它会在一段时间后报告Out of Memory 异常。崩溃时,它使用了 670mb 的 RAM,而机器的总内存为 32GB。

我认为这可能是碎片,但如果我正确理解此错误报告,它会显示最大空闲块:8185.75 GB,这表明碎片不是这里的问题。

应用程序没有在任何地方泄漏内存(至少据我所知),我启用了 ReportMemoryLeaksOnShutdown 并且它工作正常。

由于我不知道为什么它会因Out of memory 异常而崩溃,所以我想获得一些提示,以便我可以走上正确的道路来解决这个问题。

【问题讨论】:

  • 错误报告是EInvalidPointer,而不是内存不足。我们如何重现故障?
  • 它下面一点说线程 $17a4,内部异常级别 1:>> EOutOfMemory,内存不足。在调试器下运行时,它也会因该消息而崩溃。要求重现错误在这里没有多大意义。如果我知道它为什么崩溃,我一开始就不会打开这个帖子。
  • 该线程的堆栈跟踪看起来很奇怪。没有复制品,我就没什么可提供的了。
  • 您对我如何调试它有什么建议吗?关键是我不知道它为什么会崩溃以及它在哪里崩溃。应用比较复杂,做不了简单的测试用例。
  • 试着做一个简单的测试用例。并在引发内存不足异常的代码上设置断点。

标签: multithreading delphi debugging memory


【解决方案1】:

尝试在 System.pas procedure Error(errorCode: TRuntimeError); 中设置断点。当发生内存不足时,您的应用程序应该停在那里。当你到达那里时,跳过 ErrorAt 函数(通过使用上下文菜单中的 Debug->“Set next statement”)。这将默默地忽略异常,因此您可以更轻松地调试调用堆栈。使用 F7 保留函数,直到获得有用的堆栈跟踪。

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 2011-01-24
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多