`
jack_boy
  • 浏览: 137851 次
  • 性别: 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

    本文介绍了一种新的系统调用跟踪工具heuristic-strace,基于strace工具,能够实时发现和自动跟踪应用程序中通过网络通信的进程,形成进程创建关系图、进程网络通信关系图,并结合系统调用的栈回溯信息,定位进程的...

    向MInix添加系统调用实现实时进程 报告

    根据提供的文件信息,可以...通过以上知识点,我们可以了解在Minix操作系统中添加一个支持实时进程的系统调用并实现彩票调度算法的过程。这涉及到对操作系统内核源码的深入理解,以及对进程调度策略的细致设计和实现。

    cpp-一个微小的系统调用跟踪程序和调试器实现

    在Linux系统中,strace是一个非常有用的工具,它能够监控并记录进程对系统调用的使用情况。通过strace,我们可以看到程序如何与操作系统交互,比如打开文件、创建网络连接或进行进程间通信等。这个项目中的"微小...

    linux内核知识系列:系统调用

    1. `strace`: 一个用于跟踪进程系统调用的工具,帮助开发者理解程序行为和查找问题。 2. `perf`: 提供系统调用计数和性能分析,有助于性能优化。 3. 系统调用重定向:可以通过修改内核配置或使用`seccomp`机制限制或...

    Linux系统调用(返回当前的系统时间)

    要添加一个新系统调用,需要执行 3 个基本步骤:添加新函数、更新头文件、更新系统调用表。在添加新函数时,需要注意用户空间的需求,因为用户空间应用程序需要使用这个新函数。在 Linux 中,系统调用可以通过中断...

    哈工大软件学院操作系统实验3_进程运行轨迹的跟踪与统计

    在实验中,学生可能需要编写一个监控程序,该程序可以捕获和记录上述系统调用的信息,同时进行统计分析。例如,他们可能需要计算平均进程运行时间、进程切换频率、阻塞事件的数量等。这不仅要求对操作系统原理有深入...

    Linux进程管理、系统调用、文件系统

    在Linux中,进程管理和系统调用是实现这些功能的关键技术。 **Linux进程管理** 进程是操作系统资源分配的基本单位,它包含了程序在特定数据集上的执行。在Linux中,进程和任务的概念是等价的。进程有五种基本状态...

    linux 系统调用视频讲解

    2. **系统调用编号**:每个系统调用都有一个唯一的编号,如1代表`sys_exit`,2代表`sys_fork`等。这些编号在`<linux/syscalls.h>`头文件中定义。 3. **系统调用处理流程**:详细解析从用户态到内核态的切换,包括...

    Linux系统中基于系统调用序列的病毒检测方法研究.pdf

    1. **系统调用监控**:记录和分析每个进程的系统调用序列,这可以通过内核级的系统调用过滤和跟踪实现。 2. **正常行为建模**:收集大量已知安全的程序运行时的系统调用序列,构建正常行为的统计模型或模板。 3. **...

    linux系统调用可视化 操作系统课程设计 实验报告

    3. **系统调用跟踪**:使用`strace`工具可以跟踪进程的系统调用,但为了更深入地学习,我们将创建自定义的系统调用并集成到内核中。这涉及到内核模块的开发和编译,包括修改系统调用表、编写系统调用处理函数以及...

    linux进程管理调用

    ### Linux进程管理调用知识点详解 #### 一、进程与程序的概念...通过以上知识点的学习和理解,我们可以更好地掌握Linux操作系统中进程管理和系统调用的核心概念和技术,为进一步深入研究Linux内核原理打下坚实的基础。

    strace命令 跟踪系统调用

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

    Linux系统调用列表

    - **execve()**: 在当前进程上下文中加载并执行一个新的可执行程序,通常用于启动其他程序。 - **exit()**: 正常结束当前进程,清理资源并返回退出状态码给父进程。 - **_exit()**: 立即结束进程,不执行清理操作,...

    Linux系统调用列表.doc

    - `ptrace()`:允许一个进程跟踪另一个进程的执行,通常用于调试。 - `sched_*()`:一系列调度相关的系统调用,用于获取或设置进程的调度参数和策略。 2. **文件系统控制**: - `fcntl()`:对文件描述符进行各种...

    strace跟踪工具使用手册

    Strace是一个在Linux环境下用于诊断、调试和跟踪系统调用和进程间通信的工具。它通过跟踪和记录指定进程对内核的调用和接收的信号,将系统调用的名字、参数、返回值打印出来,这对于解决和定位问题非常有帮助。 在...

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

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

    linux系统调用讲解

    - 开发者可以使用strace工具来跟踪一个进程的系统调用,查看哪些系统调用被调用以及它们的参数和返回值。 - 还可以通过内核模块(如ptrace)来深入分析系统调用的行为,这对于调试和性能优化非常有用。 通过深入...

    系统调用手册

    - **功能**: `fork` 是一个用于创建新进程的基础系统调用。当一个进程调用 `fork` 后,它会产生一个新的进程(子进程),这个子进程几乎与父进程完全相同,除了PID不同。 - **返回值**: 在父进程中返回子进程的PID...

    计算机操作系统实现进程的生成

    实验目的是让学生掌握如何使用`Creat()`原语,这是一个操作系统内核提供的系统调用,用于在操作系统中创建新的进程。在Pascal中,`Creat()`可能封装了操作系统内核的底层操作,如申请进程控制块(PCB)、初始化进程...

Global site tag (gtag.js) - Google Analytics