iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Linux中怎么获取某个进程的系统调用
  • 638
分享到

Linux中怎么获取某个进程的系统调用

2023-06-09 19:06:12 638人浏览 泡泡鱼
摘要

这期内容当中小编将会给大家带来有关linux中怎么获取某个进程的系统调用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。当一个程序发生故障时,有时候想通过了解该进程正在执行的系统调用来排查问题。通常可以用

这期内容当中小编将会给大家带来有关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中怎么获取某个进程的系统调用了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网操作系统频道。

--结束END--

本文标题: Linux中怎么获取某个进程的系统调用

本文链接: https://www.lsjlt.com/news/257447.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux中怎么获取某个进程的系统调用
    这期内容当中小编将会给大家带来有关Linux中怎么获取某个进程的系统调用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。当一个程序发生故障时,有时候想通过了解该进程正在执行的系统调用来排查问题。通常可以用 ...
    99+
    2023-06-09
  • Linux系统怎么获取进程PID
    今天给大家介绍一下Linux系统怎么获取进程PID。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。在Linux系统获取进程PID的方法:方法一#ps -ef |...
    99+
    2023-06-28
  • python怎么获取json中的某个值
    在Python中,你可以使用`json`模块来解析JSON数据。首先,你需要将JSON数据加载到Python对象中,然后你可以使用对...
    99+
    2023-08-18
    python json
  • java怎么获取list中的某个数据
    要从一个List中获取特定的数据,你可以使用get()方法。这个方法接受一个索引作为参数,并返回该索引对应的元素。以下是一个示例代码...
    99+
    2023-08-15
    java list
  • linux中怎么kill掉某个用户的所有进程
    本篇文章为大家展示了linux中怎么kill掉某个用户的所有进程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. pkill方式# pkill -u ttlsa2. killall方式# kill...
    99+
    2023-06-12
  • Linux中怎么终止某个用户的所有进程
    本篇内容主要讲解“Linux中怎么终止某个用户的所有进程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux中怎么终止某个用户的所有进程”吧!在linux系统管理中,我们有时候需要kill掉...
    99+
    2023-06-12
  • java怎么获取数组中的某一个值
    在Java中,可以通过索引来获取数组中的某一个值。数组的索引从0开始,到数组长度减1结束。以下是获取数组中某一个值的示例代码:```...
    99+
    2023-09-16
    java
  • Java怎么获取JSON中某个对象的值
    这篇“Java怎么获取JSON中某个对象的值”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java怎么获取JSON中某个对象...
    99+
    2023-07-02
  • 怎么在linux中获取某个日期对应的月末日期
    这篇文章将为大家详细讲解有关怎么在linux中获取某个日期对应的月末日期,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。如下所示:date -d"$(date -...
    99+
    2023-06-09
  • linux中怎么获取系统启动时间
    本篇文章给大家分享的是有关linux中怎么获取系统启动时间,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言时间对操作系统来说非常重要,从内核级到应用层,时间的表达方式及精度各...
    99+
    2023-06-09
  • linux怎么根据进程id获取进程名
    在Linux系统中,可以使用以下命令根据进程ID获取进程名:```shellps -p -o comm=```其中,``是要查询的...
    99+
    2023-09-28
    linux
  • C#中怎么使用datagridview获取某行某列的值
    在C#中,可以使用DataGridView的Rows和Columns属性来获取指定行和列的值。首先,使用Rows属性获取指定行的Da...
    99+
    2023-09-27
    C#
  • php怎么获取mysql查询的某个值
    在PHP中,使用MySQL查询是一项非常重要的技能。查询结果通常返回多个结果行,每行包含多个值。在一些情况下,您可能需要从这些结果中仅返回一个特定的值。在MySQL中,可以使用“SELECT”语句查询数据表中的数据。当查询一个特定的...
    99+
    2023-05-14
    php mysql
  • Java怎么获取某个数值的索引
    在Java中获取某个数值的索引可以使用for循环来遍历数组或集合,然后判断每个元素是否等于目标数值,如果相等,则返回该元素的索引。 ...
    99+
    2024-03-02
    Java
  • python怎么获取某个元素的索引
    在Python中,可以使用index()方法来获取某个元素的索引。该方法接受一个参数,即要查找的元素,返回该元素在列表中第一次出现的...
    99+
    2023-10-24
    python
  • 如何理解Linux系统中的进程调度
    这篇文章主要讲解了“如何理解Linux系统中的进程调度”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Linux系统中的进程调度”吧!操作系统要实现多进程,进程调度必不可少。有人说,进...
    99+
    2023-06-12
  • linux中怎么使用shell根据进程名获取pid
    这篇文章主要介绍linux中怎么使用shell根据进程名获取pid,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!导读Linux 的交互式 Shell 与 Shell 脚本存在一定的差异,主要是由于后者存在一个独立的运...
    99+
    2023-06-09
  • 怎么获取Linux系统中的内置模块信息
    怎么获取Linux系统中的内置模块信息?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。找出内置模块列表要得到内置模块列表,运行下面的命令。代码如下:$ cat /...
    99+
    2023-06-10
  • 怎么获取linux系统启动时间
    本篇内容主要讲解“怎么获取linux系统启动时间”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么获取linux系统启动时间”吧!前言时间对操作系统来说非常重要,从内核级到应用层,时间的表达方式...
    99+
    2023-06-09
  • Linux怎么获取当前系统时间
    这篇文章将为大家详细讲解有关Linux怎么获取当前系统时间,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。date指令相关用法示例date 用法: date [OPTION]&hell...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作