为什么这个PHP函数会产生分段错误(SIGSEGV)?

时间:2011-06-13 07:19:35

标签: php segmentation-fault sigsegv

我写了以下代码。

<?php
function f(){
  return f();
}
f();

并获取输出

$ php test.php
Segmentation fault

为什么呢?我没有使用任何指针。

这是StackOverflow?

4 个答案:

答案 0 :(得分:6)

这是一个无限递归的情况,但这不是特别的原因。这是一个stack overflow。当你有递归时,无论是否无限,你都可以根据堆栈的大小(以字节为单位)递归(添加到堆栈)的最大深度。

从技术上讲,这是无限的,但你不会在很长一段时间内得到任何错误:

<?php
function f(){
  sleep(1);
  return f();
}
f();

您需要的是在递归中称为base case,以便在它消耗整个堆栈之前停止它。

<?php
function f($i){
  if($i == 10)
    return;

  echo $i;

  return f(++$i);
}
f(0);

将打印0到9。

segmentation fault错误来自操作系统,报告PHP应用程序在添加到堆栈时遇到问题。这不会成为您的脚本,因为在系统级别,构成PHP的二进制文件失败了。

答案 1 :(得分:2)

这不是无限递归吗?你想要实现什么目标?

答案 2 :(得分:0)

您设置的无限递归会继续添加堆栈帧,直到您超出分配给PHP进程调用堆栈的内存量,此时您将获得segmentation fault

答案 3 :(得分:0)

具体来自XDebug扩展。

运行GDB,您将看到:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff41f7e48 in xdebug_add_stack_frame (zdata=Cannot access memory at address 0x7fffff5fefa8
) at /build/buildd/xdebug-2.1.0/build-php5/xdebug_stack.c:772
772 /build/buildd/xdebug-2.1.0/build-php5/xdebug_stack.c: No such file or directory.
    in /build/buildd/xdebug-2.1.0/build-php5/xdebug_stack.c

如果禁用XDebug,它将一直执行,直到达到memory_limit。如果您的memory_limit太高,您可能会耗尽RAM并开始交换,冻结/崩溃您的机器。