使用strace排查Segmentation fault错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用strace排查Segmentation fault错误相关的知识,希望对你有一定的参考价值。

今天,DBA突然跟我说,有一台测试机的sqlplus用不了,让我帮忙看看什么问题。

问题现象就是,执行sqlplus命令后直接报错,登录不了ORACLE数据库:

[[email protected] ~]$ sqlplus

Segmentation fault

?

错误信息只有"Segmentation fault",没有其它的信息。由于以前自学过一点操作系统原理,知道"Segmentation fault"表示分段错误,而Segmentation是内存方面的术语,意思就是说,可能是内存方面出错了。但是,这也看不出什么。程序报错信息是开发程序的人自己写的,谁知道这程序在什么情况下会报"Segmentation fault"这个错误。

?

所以,我尝试使用starce来追踪sqlplus的系统调用情况:

[[email protected] ~]$ strace -o sqlplus_hang.log sqlplus

Segmentation fault

strace命令执行完成后,会在当前目录下生成包含sqlplus的系统调用情况信息的日志文件sqlplus_hang.log。查看日志文件内容最后面,发现:

技术分享图片

说明程序尝试打开 /u01/app/oracle/product/11.2.0/dbhome_1/lib/libsqlplusic.so,但没有找到这个文件(返回值为-1)。然后程序又尝试打开 /u01/app/oracle/product/11.2.0/dbhome_1/lib/libociicus.so,还是没有找到这个文件(返回值为-1)。所以,程序最终异常终止了,并报出"Segmentation fault"的错误信息。

?

万幸的是,我在同一台机的其它地方找到了libsqlplusic.so这个库文件,看起来版本也是一样的:

技术分享图片

然后做了个快捷链接:

[[email protected] ~]# su - oracle

[[email protected] ~]$ cd /u01/app/oracle/product/11.2.0/dbhome_1/lib/

[[email protected] lib]$ ln -s /u01/app/oracle/product/11.2.0/dbhome_1/instantclient/libsqlplusic.so libsqlplusic.so

sqlplus就可以正常使用了:

技术分享图片

?

虽然这只是一个小故障,但是,当初我花了几个月的时间去学习C语言,我一直在想,花这么多时间,去学习跟运维工作不太搭边的C语言是不是值得的。直到今天,我第一次将学到的C语言知识派上用场。如果我不懂C语言,我想我可能会看不懂strace命令的输出,不懂C程序内部的函数调用及程序逻辑,今天这个故障就不会排查地这么顺利了。当然,我的C语言也仅限于<<C Primer Plus>>,只是C语言基础知识而已,但目前来说够了。鉴于第一次在实际工作中用上C语言知识,特地写了这边文章,以作纪念。

以上是关于使用strace排查Segmentation fault错误的主要内容,如果未能解决你的问题,请参考以下文章

使用strace工具故障排查的5种简单方法

2个工具,助你排查Kubelet CPU 使用率过高问题

9.11 strace:跟踪进程的系统调用 ltrace:跟踪进程调用库函数

如何用 sysdig 监控和排查 Linux 服务器

小型公司案例 -- 局域网故障排查

AH00052: child pid 25043 exit signal Segmentation fault (11)