位置: 编程技术 - 正文
当一个程序发生故障时,有时候想通过了解该进程正在执行的系统调用来排查问题。通常可以用 strace 来跟踪。但是当进程已经处于 D 状态(uninterruptible sleep)时,strace 也帮不上忙。这时候可以通过来获取当前的系统调用以及参数。这里用最近排查的一个问题为例。碰到的问题是,发现一台服务器在执行 pvcreate 创建物理卷的时候卡死,进程状态为 D
D 状态实际是在等待系统调用返回。那么来看看究竟在等待什么系统调用
第一个数字是系统调用号,后面是参数。不同的系统调用所需的参数个数不同。这里的字段数是按最大参数数量来的,所以不一定每个参数字段都有价值。那么怎么知道系统调用号对应哪个系统调用呢?在头文件 /usr/include/asm/unistd_.h 中都有定义。也可以用个小脚本来快速查找:
对于不同的系统调用的参数,可以通过 man 2 <系统调用名> 查阅。如 man 2 read。对刚才那个例子来说,0 就对应了 read 调用。而 read 调用的第一个参数是文件描述符。
之后用 lsof 找到 7 对应的是什么文件
结果发现是个 device mapper 的设备文件。最后顺藤摸瓜,发现这个文件是 multipathd 创建的。而系统应当使用的是存储厂商提供的多路径软件。问题是由于同时开启了 multipathd 造成冲突导致的。
/proc/<PID>/syscall 对排查 D 状态进程很有用。不过在 2.6. 内核上并不支持,具体从哪个内核版本开始有这个功能,还没查到。不过至少从在 2.6. 以上版本都是支持的。
推荐整理分享Linux中获取某个进程的系统调用以及参数(故障排查案例),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!
在Shell中分割字符串的例子 比如,要分割test=aaa,bbb,cccc,dddd,可以这样arr=$(echo$test|tr",""n")还可以这样OLD_IFS=$IFSIFS=','arr=$testIFS=$OLD_IFS然后用forxin$arr;doecho$xdone看看效果或者更直接一
一个Linux系统安全设置的Shell脚本的分享(适用CentOS) 我们将常用的系统安全配置制作为一个shell脚本,只需要在服务器上运行这个shell脚本即可完成安全设置。linux的系统安全设置Shell脚本是第二次更新,已
简单的Linux查找后门思路和shell脚本分享 每个进程都会有一个PID,而每一个PID都会在/proc目录下有一个相应的目录,这是linux(当前内核2.6)系统的实现。一般后门程序,在ps等进程查看工具里
标签: Linux中获取某个进程的系统调用以及参数(故障排查案例)
本文链接地址:https://www.jiuchutong.com/biancheng/374865.html 转载请保留说明!友情链接: 武汉网站建设