主頁(yè) > 知識(shí)庫(kù) > Linux中獲取某個(gè)進(jìn)程的系統(tǒng)調(diào)用以及參數(shù)(故障排查案例)

Linux中獲取某個(gè)進(jìn)程的系統(tǒng)調(diào)用以及參數(shù)(故障排查案例)

熱門(mén)標(biāo)簽:揭陽(yáng)智能電話(huà)機(jī)器人推薦 打電話(huà)機(jī)器人接我是他的秘書(shū) 客服外呼系統(tǒng)怎么樣 江蘇云電銷(xiāo)機(jī)器人公司 百度地圖標(biāo)注錯(cuò)了有責(zé)任嗎 河南信譽(yù)好的不封卡電話(huà)外呼系統(tǒng) 華鋒e路航港口地圖標(biāo)注 地圖標(biāo)注員都是年輕人 如果做線(xiàn)上地圖標(biāo)注

當(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ò)

復(fù)制代碼 代碼如下:
cat /proc/PID>/syscall

來(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

復(fù)制代碼 代碼如下:

# 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)用

復(fù)制代碼 代碼如下:

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)快速查找:

復(fù)制代碼 代碼如下:

#!/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"


對(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)的是什么文件

復(fù)制代碼 代碼如下:

#  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/PID>/syscall 對(duì)排查 D 狀態(tài)進(jìn)程很有用。不過(guò)在 2.6.18 內(nèi)核上并不支持,具體從哪個(gè)內(nèi)核版本開(kāi)始有這個(gè)功能,還沒(méi)查到。不過(guò)至少?gòu)脑?2.6.32 以上版本都是支持的。

您可能感興趣的文章:
  • Linux C中庫(kù)函數(shù)與系統(tǒng)調(diào)用的區(qū)別詳細(xì)解析
  • linux 系統(tǒng)調(diào)用與標(biāo)準(zhǔn)庫(kù)調(diào)用的區(qū)別詳細(xì)解析
  • 三種方法實(shí)現(xiàn)Linux系統(tǒng)調(diào)用
  • 基于Linux系統(tǒng)調(diào)用--getrlimit()與setrlimit()函數(shù)的方法
  • 詳解linux系統(tǒng)調(diào)用原理
  • Linux內(nèi)核設(shè)備驅(qū)動(dòng)之系統(tǒng)調(diào)用筆記整理
  • Linux被中斷的系統(tǒng)如何調(diào)用詳解

標(biāo)簽:巴彥淖爾 婁底 馬鞍山 淘寶邀評(píng) 許昌 邵陽(yáng) 赤峰 金昌

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux中獲取某個(gè)進(jìn)程的系統(tǒng)調(diào)用以及參數(shù)(故障排查案例)》,本文關(guān)鍵詞  Linux,中,獲取,某個(gè),進(jìn)程,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Linux中獲取某個(gè)進(jìn)程的系統(tǒng)調(diào)用以及參數(shù)(故障排查案例)》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于Linux中獲取某個(gè)進(jìn)程的系統(tǒng)調(diào)用以及參數(shù)(故障排查案例)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章