微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用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语言知识,特地写了这边文章,以作纪念。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐