新聞中心
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)Linux中怎么獲取某個(gè)進(jìn)程的系統(tǒng)調(diào)用,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
當(dāng)一個(gè)程序發(fā)生故障時(shí),有時(shí)候想通過(guò)了解該進(jìn)程正在執(zhí)行的系統(tǒng)調(diào)用來(lái)排查問(wèn)題。通常可以用 strace 來(lái)跟蹤。但是當(dāng)進(jìn)程已經(jīng)處于 D 狀態(tài)(uninterruptible sleep)時(shí),strace 也幫不上忙。這時(shí)候可以通過(guò)
代碼如下:
cat /proc/
來(lái)獲取當(dāng)前的系統(tǒng)調(diào)用以及參數(shù)。
這里用最近排查的一個(gè)問(wèn)題為例。碰到的問(wèn)題是,發(fā)現(xiàn)一臺(tái)服務(wù)器在執(zhí)行 pvcreate 創(chuàng)建物理卷的時(shí)候卡死,進(jìn)程狀態(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)實(shí)際是在等待系統(tǒng)調(diào)用返回。那么來(lái)看看究竟在等待什么系統(tǒng)調(diào)用
代碼如下:
B0313010:~ # cat /proc/8443/syscall
0 0x7 0x70f000 0x1000 0x0 0x7f33e1532e80 0x7f33e1532ed8 0x7fff3a6b8718 0x7f33e128cf00
第一個(gè)數(shù)字是系統(tǒng)調(diào)用號(hào),后面是參數(shù)。不同的系統(tǒng)調(diào)用所需的參數(shù)個(gè)數(shù)不同。這里的字段數(shù)是按較大參數(shù)數(shù)量來(lái)的,所以不一定每個(gè)參數(shù)字段都有價(jià)值。那么怎么知道系統(tǒng)調(diào)用號(hào)對(duì)應(yīng)哪個(gè)系統(tǒng)調(diào)用呢?在頭文件 /usr/include/asm/unistd_64.h 中都有定義。也可以用個(gè)小腳本來(lái)快速查找:
代碼如下:
#!/bin/bash
# usage: whichsyscall
nr="$1"
file="/usr/include/asm/unistd_64.h"
gawk '$1=="#define" && $3=="'$nr'" {sub("^__NR_","",$2);print $2}' "$file"
對(duì)于不同的系統(tǒng)調(diào)用的參數(shù),可以通過(guò) man 2 <系統(tǒng)調(diào)用名> 查閱。如 man 2 read。對(duì)剛才那個(gè)例子來(lái)說(shuō),0 就對(duì)應(yīng)了 read 調(diào)用。而 read 調(diào)用的第一個(gè)參數(shù)是文件描述符。
之后用 lsof 找到 7 對(duì)應(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)是個(gè) device mapper 的設(shè)備文件。最后順藤摸瓜,發(fā)現(xiàn)這個(gè)文件是 multipathd 創(chuàng)建的。而系統(tǒng)應(yīng)當(dāng)使用的是存儲(chǔ)廠商提供的多路徑軟件。問(wèn)題是由于同時(shí)開(kāi)啟了 multipathd 造成沖突導(dǎo)致的。
/proc/
上述就是小編為大家分享的Linux中怎么獲取某個(gè)進(jìn)程的系統(tǒng)調(diào)用了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站欄目:Linux中怎么獲取某個(gè)進(jìn)程的系統(tǒng)調(diào)用-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://fisionsoft.com.cn/article/ceoogd.html