Linux中获取某个进程的系统调用以及参数(故障排查案例)

 更新时间:2014年06月11日 09:36:37   作者:  
这篇文章主要介绍了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 以上版本都是支持的。

相关文章

  • 利用perl、python、php、shell、sed、awk、c 实现字符串的翻转

    利用perl、python、php、shell、sed、awk、c 实现字符串的翻转

    今天心血来潮,看到下面的题目后延伸了一下,回顾自己以前学到的一些知识
    2014-04-04
  • bash脚本编程学习之算术运算与文件查找

    bash脚本编程学习之算术运算与文件查找

    算数运算在每个编程语言里面是最基本的功能,在bash里面也是。下面这篇文章就给大家详细介绍了脚本编程bash中的算术运算与文件查找,文中还给出了多道练习题和答案,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • Linux shell脚本中字符串连接的方法

    Linux shell脚本中字符串连接的方法

    这篇文章主要介绍了Linux shell脚本中连接字符串的方法,大家参考使用吧
    2013-12-12
  • linux中 pmap 命令详解

    linux中 pmap 命令详解

    这篇文章主要介绍了linux中 pmap 命令详解,需要的朋友可以参考下
    2017-09-09
  • Shell脚本调用另一个脚本的三种方法

    Shell脚本调用另一个脚本的三种方法

    这篇文章主要介绍了Shell脚本调用另一个脚本的三种方法,帮助大家更好的理解和学习shell,感兴趣的朋友可以了解下
    2020-08-08
  • Shell中函数返回值超出问题

    Shell中函数返回值超出问题

    这篇文章主要介绍了Shell中函数返回值超出问题,shell中通过return返回是有限制的,最大返回255,超过255,则从0开始计算,需要的朋友可以参考下
    2015-05-05
  • shell去掉文件中空行(空白行)的方法详解

    shell去掉文件中空行(空白行)的方法详解

    最近要查看的日志文件提取后有很多空行,不利于以前的文件可以进行比较了,为了向下兼容,只能取得时候把空行删除掉
    2013-10-10
  • 自动生成linux网卡配置脚本分享

    自动生成linux网卡配置脚本分享

    这篇文章主要介绍了自动生成linux网卡配置的脚本,因为Linux虚拟机在复制时候网卡信息会更新,所以导致需要重新配置网卡。本脚本功能,第一次添加网卡后,启动虚拟机,然后运行脚本(可以写在启动脚步中),然后根据ifconfig -a 的信息来创建ifcfg-ethX的配置文件或者修改对应的ifcfg-ethX的mac
    2014-03-03
  • linux shell之文件锁

    linux shell之文件锁

    经常在 shell 脚本里要阻止其它进程,比如 msmtp 自带的mail queue 脚本,这个脚本的互斥做法是不正确的,下面介绍下发现的三个通过文件达到互斥的正确做法
    2016-08-08
  • expect实现批量修改linux密码脚本分享

    expect实现批量修改linux密码脚本分享

    这篇文章主要介绍了expect实现批量修改Linux密码脚本分享,本文直接给出实现代码,需要的朋友可以参考下
    2014-12-12

最新评论