京寵展信息指南
855
2022-05-29
1、在操作系統(tǒng)運(yùn)維中會(huì)出現(xiàn)程序或系統(tǒng)命令運(yùn)行失敗,通過報(bào)錯(cuò)和日志無法定位問題根因。
2、如何在沒有內(nèi)核或程序代碼的情況下查看系統(tǒng)調(diào)用的過程。
1、strace是有用的診斷,說明和調(diào)試工具,linux系統(tǒng)管理員可以在不需要源代碼的情況下即可跟蹤系統(tǒng)的調(diào)用。
2、strace顯示有關(guān)進(jìn)程的系統(tǒng)調(diào)用的信息,這可以幫助確定一個(gè)程序使用的哪個(gè)函數(shù),當(dāng)然在系統(tǒng)出現(xiàn)問題時(shí)可以使用 strace定位系統(tǒng)調(diào)用過程中失敗的原因,這是定位系統(tǒng)問題的很好的方法。
1. strace安裝方法:
CentOS/EulerOS系統(tǒng)
# yum install strace
Ubuntu系統(tǒng):
# apt-get install strace –y
2.strace的常用參數(shù)及示例
-c
統(tǒng)計(jì)每一系統(tǒng)調(diào)用的所執(zhí)行的時(shí)間,次數(shù)和出錯(cuò)的次數(shù)等。
示例:打印執(zhí)行uptime時(shí)系統(tǒng)系統(tǒng)調(diào)用的時(shí)間、次數(shù)、出錯(cuò)次數(shù)和syscall
# strace -c uptime
-d
顯示有關(guān)標(biāo)準(zhǔn)錯(cuò)誤的strace本身的一些調(diào)試輸出。
-f
跟蹤子進(jìn)程,這些子進(jìn)程是由于fork(2)系統(tǒng)調(diào)用而由當(dāng)前跟蹤的進(jìn)程創(chuàng)建的。
-i
在系統(tǒng)調(diào)用時(shí)打印指令指針。
-t
跟蹤的每一行都以時(shí)間為前綴。
-tt
如果給出兩次,則打印時(shí)間將包括微秒。
-ttt
如果給定三次,則打印時(shí)間將包括微秒,并且前導(dǎo)部分將打印為自該**以來的秒數(shù)。
-T
顯示花費(fèi)在系統(tǒng)調(diào)用上的時(shí)間。這將記錄每個(gè)系統(tǒng)調(diào)用的開始和結(jié)束之間的時(shí)間差。
-v
打印環(huán)境,統(tǒng)計(jì)信息,termios等調(diào)用的未縮寫版本。這些結(jié)構(gòu)在調(diào)用中非常常見,因此默認(rèn)行為顯示了結(jié)構(gòu)成員的合理子集。使用此選項(xiàng)可獲取所有詳細(xì)信息。
-V
打印strace的版本號(hào)。
-e?expr
限定表達(dá)式,用于修改要跟蹤的事件或如何跟蹤它們:
-e trace=set
僅跟蹤指定的系統(tǒng)調(diào)用集。該-c選項(xiàng)用于確定哪些系統(tǒng)調(diào)用可能是跟蹤有用有用。例如,trace=open,close,read,write表示僅跟蹤這四個(gè)系統(tǒng)調(diào)用。
-e trace=file
跟蹤所有以文件名作為參數(shù)的系統(tǒng)調(diào)用。
示例:打印執(zhí)行l(wèi)s時(shí)跟文件有關(guān)的系統(tǒng)調(diào)用。
# strace -e trace=file ls
-e trace=process
跟蹤涉及過程管理的所有系統(tǒng)調(diào)用。這對(duì)于觀察進(jìn)程的派生,等待和執(zhí)行步驟很有用。
-e trace=network
跟蹤所有與網(wǎng)絡(luò)相關(guān)的系統(tǒng)調(diào)用。
-e trace=signal
跟蹤所有與信號(hào)相關(guān)的系統(tǒng)調(diào)用。
-e trace=ipc
跟蹤所有與IPC相關(guān)的系統(tǒng)調(diào)用。
-o?文件名
將跟蹤輸出寫入文件名而不是stderr。
-p?pid
使用進(jìn)程ID?pid附加到該進(jìn)程并開始跟蹤。跟蹤可以隨時(shí)通過鍵盤中斷信號(hào)(CTRL?-C)終止。
-S
按指定條件對(duì)-c選項(xiàng)打印的直方圖輸出進(jìn)行排序。
示例:打印執(zhí)行uname系統(tǒng)調(diào)用中calls的次數(shù)排序
# strace -fc -S calls uname
注:其他參數(shù)可以查看man手冊(cè)
# man strace
以“定位一次系統(tǒng)無法解析域名故障”為例
【問題現(xiàn)象】:
無法訪問外網(wǎng)域名,提示Name or service not know。
且已檢查系統(tǒng)DNS配置文件/etc/resolv.conf正確,排除DNS解析失敗。
【問題分析】:
當(dāng)前無法確定系統(tǒng)在執(zhí)行 解析域名失敗的原因,這時(shí)候需要使用strace查看系統(tǒng)調(diào)用過程,域名解析通常跟系統(tǒng)讀取文件相關(guān),因此我們只查看open file的過程。具體命令如下:
# strace -e strace=open ping www.baidu.com
如上圖所示在系統(tǒng)調(diào)用過程中出現(xiàn)/usr/lib64/libnss_dns.so.2文件缺失,則問題根因已確定為libnss_dns.so.2系統(tǒng)庫文件缺失。
【解決方法】:
libnss_dns.so.2文件由glibc-devel包產(chǎn)生,因此重新安裝該包即可,請(qǐng)執(zhí)行
# yum reinstall glibc-devel
Linux
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。