【问题标题】:NETBSD 3.1 error - in malloc(): warning: recursive callNETBSD 3.1 错误 - 在 malloc() 中:警告:递归调用
【发布时间】:2016-10-26 14:40:10
【问题描述】:

测试场景是 ping 来 IP 和 ctr+C 交替从脚本调用。

似乎在调用信号处理程序时,ping 在 malloc 内。信号处理程序也称为 malloc 并且 malloc 返回以下警告。 在 malloc() 中:警告:递归调用

但我仍然找不到它是如何导致崩溃的,请有人解释一下

【问题讨论】:

  • 如果 triptime 是一个常量并且代码中没有其他 FP(即 triptime*1000.0 在编译时完成),则某些编译会优化 FP 例程,而 printf() 会使用 FP 说明符失败 - 但这只是一个猜测,因为这里的上下文很少。
  • 当您说“崩溃”时,您是指 ping 二进制文件、操作系统还是其他东西?这当然看起来像是 3.1 ping 的一条线(在最近的 NetBSD 中,由于 64 位时序而有所不同)。另外,您正在运行什么命令行以及在什么架构上运行?这可能是与特定硬件相关的奇怪硬件/操作系统问题。
  • 我更新了问题,请您现在检查一下

标签: c linux network-programming reentrancy netbsd


【解决方案1】:

啊,使用不可重入函数的可怕信号处理程序问题。

问题在于 *BSD ping 的特性添加维护者从一开始就致力于安全地做事。

FreeBSD 在 1994 年添加了这个问题,并在 1996 年注意到了这个问题,并开始了一条比实际更短的路径来解决这个问题,最终在 1998 年的某个时候修复。

OpenBSD 在 1997 年添加了这个问题,在 2002 年注意到了它,但完全忽略了问题的本质,直到 2015 年才正确和完全地修复它。

NetBSD 在 1996 年添加了这个问题,但正如您所发现的,它还没有被修复。 NetBSD 应该可以导入 OpenBSD ping。

问题在于malloc() 和任何 STDIO(包括 printf())都不是可重入的,这是信号处理程序中使用的所有代码的必要条件。

有很多更好的地方可以找到关于重入、信号处理程序问题等的描述,但也许这个问题及其接受的答案(以及一些相关问题)将是一个好的开始:

Why are malloc() and printf() said as non-reentrant?

【讨论】:

  • 谢谢格雷格。你说的对。这就是问题。但是当按下 ctr+c 时,必须打印 ping 统计信息。您对我如何避免 printf 有任何想法吗?
  • 我曾建议移植 OpenBSD 的 ping,但我试过了,它的工作量比我想象的要多得多(尽管这样做很值得)。不幸的是,避免核心转储所需的完整和适当的修复可能几乎是一项冗长的工作。 (我认为移植 FreeBSD 的 ping 会更加乏味)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
相关资源
最近更新 更多