使用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错误的主要内容,如果未能解决你的问题,请参考以下文章
9.11 strace:跟踪进程的系统调用 ltrace:跟踪进程调用库函数
AH00052: child pid 25043 exit signal Segmentation fault (11)