91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux中怎么獲取某個進程的系統調用

發布時間:2021-07-29 11:39:14 來源:億速云 閱讀:127 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關Linux中怎么獲取某個進程的系統調用,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

當一個程序發生故障時,有時候想通過了解該進程正在執行的系統調用來排查問題。通常可以用 strace 來跟蹤。但是當進程已經處于 D 狀態(uninterruptible sleep)時,strace 也幫不上忙。這時候可以通過

代碼如下:

cat /proc/<PID>/syscall


來獲取當前的系統調用以及參數。


這里用最近排查的一個問題為例。碰到的問題是,發現一臺服務器在執行 pvcreate 創建物理卷的時候卡死,進程狀態為 D

代碼如下:


# ps aux|grep pvcreate
root      8443  0.0  0.0  27096  2152 ?        D    Apr04   0:00 pvcreate /dev/sddlmac
...


D 狀態實際是在等待系統調用返回。那么來看看究竟在等待什么系統調用

代碼如下:


B0313010:~ # cat /proc/8443/syscall
0 0x7 0x70f000 0x1000 0x0 0x7f33e1532e80 0x7f33e1532ed8 0x7fff3a6b8718 0x7f33e128cf00

第一個數字是系統調用號,后面是參數。不同的系統調用所需的參數個數不同。這里的字段數是按最大參數數量來的,所以不一定每個參數字段都有價值。那么怎么知道系統調用號對應哪個系統調用呢?在頭文件 /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"


對于不同的系統調用的參數,可以通過 man 2 <系統調用名> 查閱。如 man 2 read。對剛才那個例子來說,0 就對應了 read 調用。而 read 調用的第一個參數是文件描述符。

之后用 lsof 找到 7 對應的是什么文件

代碼如下:


#  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

結果發現是個 device mapper 的設備文件。最后順藤摸瓜,發現這個文件是 multipathd 創建的。而系統應當使用的是存儲廠商提供的多路徑軟件。問題是由于同時開啟了 multipathd 造成沖突導致的。

/proc/<PID>/syscall 對排查 D 狀態進程很有用。不過在 2.6.18 內核上并不支持,具體從哪個內核版本開始有這個功能,還沒查到。不過至少從在 2.6.32 以上版本都是支持的。

上述就是小編為大家分享的Linux中怎么獲取某個進程的系統調用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

垦利县| 西贡区| 平昌县| 鄂伦春自治旗| 东至县| 黄浦区| 全南县| 青浦区| 诸暨市| 普兰县| 光山县| 历史| 祁阳县| 灵寿县| 武宁县| 中西区| 赣榆县| 如东县| 德庆县| 边坝县| 杭锦后旗| 宾阳县| 平凉市| 山丹县| 赣州市| 分宜县| 太仓市| 潍坊市| 长泰县| 呼玛县| 涿鹿县| 唐山市| 普定县| 肇庆市| 苏州市| 渭南市| 永川市| 抚松县| 鄯善县| 利辛县| 凤冈县|