【问题标题】:Calloc failed for bytesCalloc 字节数失败
【发布时间】:2023-03-02 22:01:01
【问题描述】:

在我们的生产环境中,当我们将 .so 文件作为批处理的一部分执行时,我们总是会遇到如下致命错误:

calloc 失败了 9088 字节 日期 12-07-2013 01:55:05

能否请您告诉我 calloc 内存问题的可能原因。

【问题讨论】:

  • 听起来您的内存不足。有看过问题发生时的内存消耗吗?
  • @djf:系统内存充足。
  • @djf:这只发生在一个特定的进程中。

标签: c unix aix


【解决方案1】:

这背后可能有两个原因

1)你没有足够的内存

2)Calloc 没有获得所请求大小的连续内存块。

在第一种情况下,您没有任何选择,但如果有第二种情况,那么您可以将一个 calloc 调用分解为 2.3..或更多调用以获得小块连续内存。

【讨论】:

  • 1.我们有足够的内存。 2.这个选项我可以试试。你能否让我知道我怎样才能打破一个calloc。感谢您的意见。
  • calloc 需要参数中的 number 和 sizeof(elements)。因此,与其要求一个大数字,不如将这个数字分成两个或多个并为每个调用 calloc。例如将 calloc(600,sizeof(int)) 分解为 calloc(200,sizeof(int));calloc(400.sizoef(int));
【解决方案2】:

也许您应该检查“进程可以使用的 AIX 数据段的最大数量”是如何设置的(环境变量 LDR_CNTRL)。请参阅 IBM Performance Tuning Guide on aix ulimit 如果它告诉您数据大小是无限的。

【讨论】:

  • 这很可能是第一个看+1的地方
【解决方案3】:

这有很多可能的原因:

  1. 进程内存不足。相对不太可能,而且你已经忽略了这一点。
  2. calloc() 使用的控制信息已被覆盖损坏,导致程序内存不足的错误报告。这可能是因为您的程序在分配的内存范围之外写入。
  3. 报告错误的代码行写错了。

由于大小很小(9088 字节),您不太可能遇到算术溢出问题。

通常,建议您使用valgrind 来检测内存问题。但是,这在 AIX 上不可用。也许你有Purify;这是完成这项工作的绝佳工具(但它不是免费软件)。

【讨论】:

  • +1 表示堆损坏的可能性 - 可能很难追踪,但我会说它可能是最有可能的替代方案......
猜你喜欢
  • 2012-10-26
  • 2020-11-26
  • 2012-05-11
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 2020-07-28
相关资源
最近更新 更多