Linux中獲取某個進程的系統(tǒng)調(diào)用以及參數(shù)(故障排查案例)
當(dāng)一個程序發(fā)生故障時,有時候想通過了解該進程正在執(zhí)行的系統(tǒng)調(diào)用來排查問題。通??梢杂?strace 來跟蹤。但是當(dāng)進程已經(jīng)處于 D 狀態(tài)(uninterruptible sleep)時,strace 也幫不上忙。這時候可以通過
來獲取當(dāng)前的系統(tǒng)調(diào)用以及參數(shù)。
這里用最近排查的一個問題為例。碰到的問題是,發(fā)現(xiàn)一臺服務(wù)器在執(zhí)行 pvcreate 創(chuàng)建物理卷的時候卡死,進程狀態(tài)為 D
# ps aux|grep pvcreate
root 8443 0.0 0.0 27096 2152 ? D Apr04 0:00 pvcreate /dev/sddlmac
...
D 狀態(tài)實際是在等待系統(tǒng)調(diào)用返回。那么來看看究竟在等待什么系統(tǒng)調(diào)用
B0313010:~ # cat /proc/8443/syscall
0 0x7 0x70f000 0x1000 0x0 0x7f33e1532e80 0x7f33e1532ed8 0x7fff3a6b8718 0x7f33e128cf00
第一個數(shù)字是系統(tǒng)調(diào)用號,后面是參數(shù)。不同的系統(tǒng)調(diào)用所需的參數(shù)個數(shù)不同。這里的字段數(shù)是按最大參數(shù)數(shù)量來的,所以不一定每個參數(shù)字段都有價值。那么怎么知道系統(tǒng)調(diào)用號對應(yīng)哪個系統(tǒng)調(diào)用呢?在頭文件 /usr/include/asm/unistd_64.h 中都有定義。也可以用個小腳本來快速查找:
#!/bin/bash
# usage: whichsyscall <syscall_nr>
nr="$1"
file="/usr/include/asm/unistd_64.h"
gawk '$1=="#define" && $3=="'$nr'" {sub("^__NR_","",$2);print $2}' "$file"
對于不同的系統(tǒng)調(diào)用的參數(shù),可以通過 man 2 <系統(tǒng)調(diào)用名> 查閱。如 man 2 read。對剛才那個例子來說,0 就對應(yīng)了 read 調(diào)用。而 read 調(diào)用的第一個參數(shù)是文件描述符。
之后用 lsof 找到 7 對應(yīng)的是什么文件
# lsof -p 8443
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
......
pvcreate 8443 root 5u CHR 10,236 0t0 19499 /dev/mapper/control
pvcreate 8443 root 6u BLK 253,1 0t8192 36340797 /dev/dm-1
pvcreate 8443 root 7u BLK 253,5 0t0 35667968 /dev/dm-5
結(jié)果發(fā)現(xiàn)是個 device mapper 的設(shè)備文件。最后順藤摸瓜,發(fā)現(xiàn)這個文件是 multipathd 創(chuàng)建的。而系統(tǒng)應(yīng)當(dāng)使用的是存儲廠商提供的多路徑軟件。問題是由于同時開啟了 multipathd 造成沖突導(dǎo)致的。
/proc/<PID>/syscall 對排查 D 狀態(tài)進程很有用。不過在 2.6.18 內(nèi)核上并不支持,具體從哪個內(nèi)核版本開始有這個功能,還沒查到。不過至少從在 2.6.32 以上版本都是支持的。
相關(guān)文章
linux下passwd命令設(shè)置修改用戶密碼的方法
下面小編就為大家?guī)硪黄猯inux下passwd命令設(shè)置修改用戶密碼的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02一天一個shell命令 linux文本操作系列-touch命令用法
這篇文章主要介紹了一天一個shell命令 linux文本操作系列-touch命令用法 ,需要的朋友可以參考下2016-06-06shell腳本批量復(fù)制及執(zhí)行命令的示例詳解
這篇文章主要介紹了批量復(fù)制及執(zhí)行命令shell腳本,本文通過列舉幾個示例給大家詳細介紹,對大家的工作或?qū)W習(xí)具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03Shell腳本獲取國內(nèi)各大運營商網(wǎng)段腳本分享
這篇文章主要介紹了Shell腳本獲取國內(nèi)各大運營商網(wǎng)段腳本分享,本文使用亞太地區(qū)網(wǎng)絡(luò)信息記錄作為數(shù)據(jù)源,然后使用Shell腳本分析國內(nèi)的網(wǎng)段,需要的朋友可以參考下2014-12-12