`
jack_boy
  • 浏览: 135349 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

跟踪同一个系统中不同进程的系统调用

阅读更多
跟踪同一个系统中不同进程的系统调用

在编写多线程的程序时,偶尔会遇到某一个线程不工作的现象,想看看到底卡在什么地方。
1)查看日志,在每行日志中都添加线程号,该方法存在一个问题,当日志滚动很多天时,找到某个线程的最后一行日志比较费劲,并且如果没有很详细的debug日志的话,代码检查范围也比较广。
2)使用strace命令,strace命令是查看某个进程的系统调用,我们知道linux下线程其实是进程模拟的,它也有一个进程号。
> top -H -p pid 
Cpu(s):  0.0%us,  0.1%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st                                                     [18/1958]
Mem:  32845044k total, 11038828k used, 21806216k free,   881144k buffers
Swap:  8388600k total,        0k used,  8388600k free,  8332956k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                        
20261 jackboy   20   0  899m 6468  908 S  0.0  0.0   0:02.95 ldapproxy                                                                      
20262 jackboy   20   0  899m 6468  908 S  0.0  0.0   0:06.99 ldapproxy                                                                      
20263 jackboy   20   0  899m 6468  908 S  0.0  0.0   0:06.96 ldapproxy                                                                      
20264 jackboy   20   0  899m 6468  908 S  0.0  0.0   0:06.96 ldapproxy                                                                      
20265 jackboy   20   0  899m 6468  908 S  0.0  0.0   0:06.96 ldapproxy                                                                      
20266 jackboy   20   0  899m 6468  908 S  0.0  0.0   0:00.49 ldapproxy                                                                      
20267 jackboy   20   0  899m 6468  908 S  0.0  0.0   0:00.49 ldapproxy                                                                      
20268 jackboy   20   0  899m 6468  908 S  0.0  0.0   0:00.49 ldapproxy                                                                      
20269 jackboy   20   0  899m 6468  908 S  0.0  0.0   0:00.49 ldapproxy                                                                      
20270 jackboy   20   0  899m 6468  908 S  0.0  0.0   0:00.49 ldapproxy                                                                      
20271 jackboy   20   0  899m 6468  908 S  0.0  0.0   0:00.49 ldapproxy                                                                      
20272 jackboy   20   0  899m 6468  908 S  0.0  0.0   0:00.49 ldapproxy                                                                      
20273 jackboy   20   0  899m 6468  908 S  0.0  0.0   0:00.49 ldapproxy 

或者使用pstree -p pid
ldapproxy(20261)─┬─{ldapproxy}(20262)
                 ├─{ldapproxy}(20263)
                 ├─{ldapproxy}(20264)
                 ├─{ldapproxy}(20265)
                 ├─{ldapproxy}(20266)
                 ├─{ldapproxy}(20267)
                 ├─{ldapproxy}(20268)
                 ├─{ldapproxy}(20269)
                 ├─{ldapproxy}(20270)
                 ├─{ldapproxy}(20271)
                 ├─{ldapproxy}(20272)
                 └─{ldapproxy}(20273)

然后调用strace -p pid就可以查看每个线程的系统调用。

接下来,用pstack pid命令查看系统调用的栈,相当于gdb的bt命令

附:
通过查找发现程序卡在futex上,如:
futex(0xb770b0, FUTEX_WAIT, 2, NULL

google查询之后,确定为信号处理函数中调用了snprintf函数,printf函数族为不可重入的,在信号处理函数中调用,其结果为未确定
分享到:
评论

相关推荐

    论文研究-Linux系统调用跟踪和进程错误退出分析.pdf

    通过扩展Linux系统调用跟踪工具strace,实现了启发式跟踪工具heuristic-strace,其能够实时发现和自动跟踪应用程序中通过网络通信的进程,形成进程创建关系图、进程网络通信关系图,并结合系统调用的栈回溯信息,...

    Linux系统调用跟踪和进程错误退出分析.pdf

    Linux系统调用跟踪和进程错误退出分析.pdf

    strace命令 跟踪系统调用

    strace命令是一个集诊断、调试、统计与...strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 语法格式:strace [参数] 常用参数: -c 统计每一系统调用的所执行的时间,次数和出错的次数等

    操作系统实验:进程运行轨迹的跟踪与统计

    哈工大的操作系统实验三,今年老师要求制作PPT,于是良心制作,详细记录了系统调用的相关操作及实验结论,希望对有心人有用,大家共同进步

    Unix操作系统设计

    第5章 文件系统的系统调用 5.1 系统调用Open 5.2 系统调用read 5.3 系统调用write 5.4 文件和记录的上锁 5.5 文件的输入/输出位置的调整lseek 5.6 系统调用close 5.7 文件的建立 5.8 特殊文件的建立 5.9 改变...

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

    当一个程序发生故障时,有时候想通过了解该进程正在执行的系统调用来排查问题。通常可以用 strace 来跟踪。但是当进程已经处于 D 状态(uninterruptible sleep)时,strace 也帮不上忙。这时候可以通过 代码如下:cat...

    strace跟踪工具使用手册

    非常详细地介绍了strace系统调用跟踪工具的使用方法,列举了工程实践中常遇到的调试手段和解决方法。

    操作系统课程设计试验

    当一个进程调用了fork以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程ID和父进程ID,其他的都是一样。就象符进程克隆(clone)自己一样.当然创建两个一模一样的进程是没有意义的。为了区分父进程...

    一个Windows进程抓包器的C++实现

    一个Windows进程抓包器的C++实现

    UNIX操作系统设计(The Design of the UNIX Operating System)

    第1章 系统概貌 1.1 历史 1.2 系统结构 1.3 用户看法 1.3.1 文件系统 1.3.2 处理环境 1.3.3 构件原语 1.4 操作系统服务 1.5 关于硬件的假设 1.5.1 中断与例外 1.5.2 处理机执行级 1.5.3 存储管理 1.6 本...

    Linux用strace查看系统调用

    strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。  输出参数含义 root@ubuntu:/usr# strace cat /dev/null execve(/bin/cat, [cat, /dev/null], [/* 22 vars */]) = 0 brk(0) 

    操作系统课程设计任务书

    利用C语言,、DOS中断中21H与屏幕显示相关的中断调用设计完成,具体包括:1.进程模拟数据读取与分析2.进程调度(状态转换)3.进程运行状态显示4.页式空间组织与管理5.页式存储空间分配6.页式存储空间回收7、页的调入...

    SystemCallService:适用于 Windows 7 8 2008 2012 的进程线程级系统调用跟踪器

    系统调用服务适用于 Windows 7 / 8 / 2008 / 2012 的主机/进程/线程级系统调用跟踪器先决条件需要 .NET Framework 4.5 或更高版本Windows 7 / 2008 / 2008 R2 / 8 / 8.1 / 2012 / 2012 R2 TraceEvent 1.0.29(可以...

    清华大学Linux操作系统原理与应用

    6.5 实例——利用系统调用实现一个调用日志收集系统 143 6.5.1 代码体系结构 143 6.5.2 把代码集成到内核中 146 6.5.3 实现步骤 148 习题6 148 第7章 内核中的同步 149 7.1 临界区和竞争状态 149 7.1.1 临界区举例 ...

    合工大计算机学院操作系统 实验五-进程的创建

    合工大计算机学院操作系统 实验五-进程的创建 1. 实验目的和任务要求 掌握创建子进程和加载执行新程序的方法,理解创建子进程和加载执行程序 ...调试跟踪 fork 和 execve 系统调用函数的执行过程。

    vltrace:使用eBPF linux内核功能以快速方式跟踪系统调用的工具

    vltrace是一个系统调用跟踪工具,它利用eBPF(Linux内核的有效跟踪功能)。执照请参阅文件以获取有关此工具如何获得的信息。依赖vltrace取决于库。 libbcc的安装指南可以在找到。系统要求内核v4.7或更高版本 安装的...

    UNIX 高级教程系统技术内幕

    2.4.1 系统调用接口 2.4.2 中断处理 2.5 同步 2.5.1 阻塞操作 2.5.2 中断 2.5.3 多处理器 2.6 进程调度 2.7 信号 2.8 新进程和程序 2.8.1 fork 和exec 2.8.2 进程创建 2.8.3 fork 优化 2.8.4 执行一个新程序 2.8.5 ...

    Linux内核源代码分析视频课-视频教程网盘链接提取码下载.txt

    本课程从理解计算机硬件的核心工作机制(存储程序计算机和函数调用堆栈)和用户态程序如何通过系统调用陷入内核(中断...12.使用库函数API和C代码中嵌入汇编代码触发同一个系统调用 13.给MenuOS增加time和time-asm命令

    Linux内核源代码情景分析 (上下册 高清非扫描 )

    6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1系统调用socket() 7.2函数sys—socket()——创建插口 7.3函数sys—bind()——指定插口地址 7.4函数...

    cpp-ptrace是process和trace的简写直译为进程跟踪

    ptrace是process和trace的简写,直译为进程跟踪。它提供了一种使父进程得以监视和控制其子进程的方式,它还能够改变子进程中的寄存器和内核映像,因而可以实现系统调用的跟踪和断点调试。

Global site tag (gtag.js) - Google Analytics