1. 程式人生 > >使用strace排查Segmentation fault錯誤

使用strace排查Segmentation fault錯誤

51cto 這也 文件內容 com 說明 middle col prim vpd

今天,DBA突然跟我說,有一臺測試機的sqlplus用不了,讓我幫忙看看什麽問題。

問題現象就是,執行sqlplus命令後直接報錯,登錄不了ORACLE數據庫:

[oracle@epay-test ~]$ sqlplus

Segmentation fault

?

錯誤信息只有"Segmentation fault",沒有其它的信息。由於以前自學過一點操作系統原理,知道"Segmentation fault"表示分段錯誤,而Segmentation是內存方面的術語,意思就是說,可能是內存方面出錯了。但是,這也看不出什麽。程序報錯信息是開發程序的人自己寫的,誰知道這程序在什麽情況下會報"Segmentation fault"這個錯誤。

?

所以,我嘗試使用starce來追蹤sqlplus的系統調用情況:

[oracle@epay-test ~]$ 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這個庫文件,看起來版本也是一樣的:

技術分享圖片

然後做了個快捷鏈接:

[root@epay-test ~]# su - oracle

[oracle@epay-test ~]$ cd /u01/app/oracle/product/11.2.0/dbhome_1/lib/

[oracle@epay-test 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錯誤