1

我目前正在 Amazon EC2 服务器上运行一个非常密集的 Perl 脚本。脚本应该需要几周时间才能完成。

该脚本从大量文件中读取信息,处理并将我需要的信息输出到文本文件中,并在终端上打印一点状态信息。它似乎运行良好,输出似乎是正确的。然而,在每个文本文件的处理接近尾声时,由于某种莫名其妙的原因,该脚本正在将一堵文本墙转储到终端上:

终端输出

文本似乎是内存地址,但我不知道为什么会发生这种情况。我应该担心吗?任何帮助深表感谢!


编辑:STDERR 和 STDOUT 被打印到文本文件中。我更仔细地梳理了输出,似乎缺少一些信息。我在脚本中添加了 close(STDERR) 和 close(STDOUT),以查看是否存在某种打印错误。该脚本现在打印以下错误*** buffer overflow detected ***: Perl terminated

新的终端输出

4

1 回答 1

2

鉴于您最近编辑中的更新屏幕截图,XS 模块中似乎存在一个错误,溢出缓冲区,这就是堆栈回溯所抱怨的。您可以在屏幕截图中看到回溯:

/lib64/libc.so.6(__fortify_fail+0x37)[0x7fb026838637]
/lib64/libc.so.6(+0xf8690)[0x7fb026836690]
/home/ex2-user/j_authority/_Inline/lib/auto/author_da35/author_da35.so(profiles_c+0x27fd)[0x7fb008a529ad]
/home/ex2-user/j_authority/_Inline/lib/auto/author_da35/author_da35.so(XS_author_profiles_c+0x32a)[0x7fb008a55afa]

因此,当 Fortify 检测到堆栈溢出时,您似乎正处于此 XS 模块的中间。这表明某个函数内部的函数局部数组会author_da35溢出。例如,如果它调整了一些需要 32 位指针的结构的大小,但您在 64 位机器上运行,则可能会发生这种情况。(看起来你是。)或者,它可能只是分配了一个固定大小的结构,而你的数据集需要更大的东西。

环顾四周,一些其他类型的问题可能会触发“缓冲区溢出”,例如打开太多文件,但这似乎不太可能发生。

无论如何,这似乎是模块中的一个错误。

如果您不熟悉 XS,简短的描述是它是一种允许 perl 调用本机编译代码的机制。Perl 本身是解释型的,但它的 XS API 允许您将 perl 代码与 C 或 C++ 等编译语言进行接口。如果您对 XS 感兴趣,请提供几个链接:

至于解决您的问题,您需要实际更正profiles_c. author_da35希望您与该模块的作者关系良好。:-)

您可以通过谷歌搜索了解有关 Fortify 的更多信息FORTIFY_SOURCE

于 2013-07-24T05:00:11.753 回答