在 Linux coredump 中发现 Perl 分段错误

Posted

技术标签:

【中文标题】在 Linux coredump 中发现 Perl 分段错误【英文标题】:In Linux coredump found Perl segmentation faults 【发布时间】:2019-10-22 10:49:03 【问题描述】:

我正在使用基于 Oracle Linux 6.10 的定制操作系统。我几乎没有自定义命令可以帮助查找防火墙规则、硬件信息等信息,但如果我运行这些命令,则会生成核心转储。

在我的一台 OracleLinux6.10 服务器上找到了 4 个核心文件,例如 core.top.myrole.34089.bt

以下是由 top.myrole 生成的错误“程序以信号 6 终止,已中止/没有可用的符号表信息”:

10/15/2019 13:54:57 core.top.myrole.34089.bt

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

top.myrole: No such file or directory.

Missing separate debuginfo for the main executable file

Try: yum --enablerepo='*-debug*' install

/usr/lib/debug/.build-id/81/7805fb3de3731d5c36c8f7da38040ee6d510ea

[New Thread 34090]

[New Thread 34089]

Core was generated by \top.myrole'.`

Program terminated with signal 6, Aborted.

#0 0x000000347960f00d in ?? ()

Thread 2 (Thread 34089):

#0 0x000000347960f00d in ?? ()

No symbol table info available.

#1 0x0000000000000001 in ?? ()

No symbol table info available.

在上述行之后,“无符号表”错误现在会在多个线程中重复。

然后发现在运行自定义命令“hardwareshow”时也生成了其他核心转储(此命令不是 linux 命令,但它是在我们的发行版中自定义的)。日志显示核心是由 '/usr/bin/perl /usr/product/bin/iprule show' 生成的:

10/14/2019 20:44:25, core.hardwareshow.8944.bt
warning: core file may not match specified executable file.
[New Thread 55835]
[Thread debugging using libthread_db enabled]
Core was generated by \/usr/bin/perl /usr/product/bin/iprule show--type=rule --protocol=ipv6 -'.Program terminated with signal 11, Segmentation fault.#0  0x0000003479a80829 in ?? () from /usr/lib64/perl5/CORE/libperl.so`

------------
10/14/2019 04:19:59, core.iprule.55835.bt

我检查了机器使用的Perl版本,似乎是Perl5,(仍然需要确认它是否是5.10)。我该如何解决这个问题,我从一些Perl专家那里听说Perl升级到新的版本在这里仍然可以提供帮助我希望从多个 Linux 开发人员/Perl 开发人员那里听到有关此错误的信息。

【问题讨论】:

跨帖:redd.it/dlfg4j 就目前而言,您的问题是“我如何调试 C 程序”,这个话题太大了。 至少,你应该得到一个堆栈回溯! 你说你遇到了段错误,但信号 6 在我的系统上是 SIGABRT,而不是 SIGSEGV 【参考方案1】:

perl 解释器会在以下情况下进行核心转储: 其实现中存在错误;如果使用了某些病态 Perl 代码模式(例如,无限递归调用 tie 或重载处理程序);或者如果使用 C 级代码的外部模块(如 XS 模块)中存在错误。确定故障是什么可能很困难。如果您只是想让问题消失,那么将所有内容升级到更新的版本可能是阻力最小的途径。请注意,perl 5.10.0 版本大约有 12 年的历史。

【讨论】:

以上是关于在 Linux coredump 中发现 Perl 分段错误的主要内容,如果未能解决你的问题,请参考以下文章

SIGABRT 和 COREDUMP

如何查询和修改Linux操作系统生成core dump文件的默认路径?

Linux之ack命令

3. Coredump故障分析

Linux内核调试方法总结之coredump

linux下coredump学习