IT技术博客大学习 共学习 共进步

无限递归导致 Segmentation fault

qingbo.blog 2012-03-04 20:33:00 浏览 3,321 次

    某服务器上一个 cron job 是 shell 脚本调用 Java 程序,最近老是报 Segmentation fault, 每次看见此信息

    /bin/sh: line 1: 4285 Segmentation fault java ...

    总觉得无处下手,bash 的问题?Java 版本不对?信息量太少了。其实遇到这种事情不能谎,表面上没有信息一定要挖出信息来。今天仔细一看,这个脚本把标准输出重定向到一个日志文件去了,于是去看日志。这个程序的主体是对一个信息列表做循环,恰好在每个循环的关键部分开始前、结束后都会写一条日志。其目的是为了计时,不过正是这两条日志让我很快找到了错误缘由,因为发现日志文件的末尾只有一个开始前的,说面在这个循环的处理过程里面发生了 Segmentation fault.

    找出程序的源代码,发现循环里面调用的方法有一个是递归的,情况就开始明朗了,猜测就是递归无法终止导致 stack overflow,segmentation fault. 果然,根据日志里最后一行日志中记录的真实数据,发现这条数据是有问题的,会导致此方法无限递归。

    Wikipedia 的 Segmentation fault 词条里有一节是 "Common causes", 我这次遇到的就是最后一条。

建议继续学习

  1. PHP与递归Recursion (阅读 9,123)
  2. 循环、迭代、遍历和递归 (阅读 5,423)
  3. 递归并不一定非得是“自己调用自己的function” (阅读 4,164)
  4. 小心递归次数限制 (阅读 3,942)
  5. PHP正则之递归匹配 (阅读 3,602)
  6. 倒置字符串中的单词 (阅读 3,485)
  7. 递归创建目录的一个函数 (阅读 3,122)
  8. 递归字符转义 (阅读 2,841)