Linux上进程追踪与调试(strace和gdb)
2016-11-07 10:13
381 查看
引言:
我们某些服务出现故障的时候,我们都是根据屏幕的输出以及打印的日志来查找出出现了什么样的错误,但是有时候我们的很多守护进程启动正常却访问不到,比如我们使用Nginx服务,登陆web的时候,却迟迟不发生页面跳转或者访问页面迟迟没反应,这个时候我们就需要对nginx这个服务做一次进程追踪,我们使用strace/gdb这样的命令对进程做一次追踪,
strace:
1,strace命令说明
strace是能够显示用户空间发出的任何系统调用,在命令的执行过程中,strace会记录和解析命令进程的所有系统调用以及这个进程所收到的所有信号值
2,strace的使用
1)strace后面直接跟我们的命令
![](http://s3.51cto.com/wyfs02/M02/89/D4/wKioL1gfGu7DeO94AADxcT19NUI485.png)
可以看到后面跟了许多系统调用的函数,我们根据这些可以清楚的知道,我们这个命令执行时发生了那些系统调用
2)使用-p选项,这个后面跟我们的pid号,可以查看当前进程处于什么状态
我们使用-p选项后面跟着nginx的进程号
![](http://s5.51cto.com/wyfs02/M00/89/D7/wKiom1gfHBbSZo31AABQRGCm1p0852.png)
我们可以看到,当我们的nginx没有访问量的时候,进程处于epoll_wait状态
当使用ab来对nginx做一次压力测试的时候,就会发现nginx进程疯狂的做系统调用
![](http://s1.51cto.com/wyfs02/M01/89/D7/wKiom1gfHvXAN77xAACk-XCHvM4688.png)
![](http://s1.51cto.com/wyfs02/M01/89/D4/wKioL1gfHwWxopVnAAC-7mSxlpE205.png)
访问数据的时候,需要处理各种数据,进程会有大量的系统调用产生
3)使用-c选项,我们可以显示进程使用系统调用的摘要信息,及使用了多少次系统调用
![](http://s4.51cto.com/wyfs02/M00/89/D4/wKioL1gfIQeDZIYkAAB0DpUajvY785.png)
我们可以看到使用的read,write,open这些系统调用,以及总共产生了多少次系统调用
4)使用-o选项,我们可以将分析结构保存在某个文件中,以供后续分析使用
5) 使用-t(秒)-tt(微秒)-ttt(微秒,时间为UNIX时间戳,即从1970年1月1日起的时间)
![](http://s2.51cto.com/wyfs02/M01/89/D7/wKiom1gfI5WQYlRaAABlcoovD3M658.png)
![](http://s4.51cto.com/wyfs02/M01/89/D7/wKiom1gfI8rRmSnqAABgybRB6Mg998.png)
![](http://s5.51cto.com/wyfs02/M02/89/D4/wKioL1gfI5aziDGQAABkL4rIVRM409.png)
gdb:
<1>gdb命令说明
gdb是Linux下及UNIX下的程序调试工具,我们可以启动程序,让程序按照我们的需求来自由的运行
<2>gdb使用attach,后面跟着我们的pid信息,查看我们的进程状态
![](http://s3.51cto.com/wyfs02/M02/89/D5/wKioL1gfL2LiX0aeAABLO5Haedw239.png)
如果想知道程序现在运行到了哪里,同样可以使用“backtrace”命令。当然也可以使用“step”命令对程序进行单步调试。在完成调试之后,不要忘记用detach命令断开连接,让被调试的进程可以继续正常运行。
gdb是个很复杂的工具,一般Linux下的C开发程序员会用到的比较多,这里就不做深入探讨了
我们某些服务出现故障的时候,我们都是根据屏幕的输出以及打印的日志来查找出出现了什么样的错误,但是有时候我们的很多守护进程启动正常却访问不到,比如我们使用Nginx服务,登陆web的时候,却迟迟不发生页面跳转或者访问页面迟迟没反应,这个时候我们就需要对nginx这个服务做一次进程追踪,我们使用strace/gdb这样的命令对进程做一次追踪,
strace:
1,strace命令说明
strace是能够显示用户空间发出的任何系统调用,在命令的执行过程中,strace会记录和解析命令进程的所有系统调用以及这个进程所收到的所有信号值
2,strace的使用
1)strace后面直接跟我们的命令
![](http://s3.51cto.com/wyfs02/M02/89/D4/wKioL1gfGu7DeO94AADxcT19NUI485.png)
可以看到后面跟了许多系统调用的函数,我们根据这些可以清楚的知道,我们这个命令执行时发生了那些系统调用
2)使用-p选项,这个后面跟我们的pid号,可以查看当前进程处于什么状态
我们使用-p选项后面跟着nginx的进程号
![](http://s5.51cto.com/wyfs02/M00/89/D7/wKiom1gfHBbSZo31AABQRGCm1p0852.png)
我们可以看到,当我们的nginx没有访问量的时候,进程处于epoll_wait状态
当使用ab来对nginx做一次压力测试的时候,就会发现nginx进程疯狂的做系统调用
![](http://s1.51cto.com/wyfs02/M01/89/D7/wKiom1gfHvXAN77xAACk-XCHvM4688.png)
![](http://s1.51cto.com/wyfs02/M01/89/D4/wKioL1gfHwWxopVnAAC-7mSxlpE205.png)
访问数据的时候,需要处理各种数据,进程会有大量的系统调用产生
3)使用-c选项,我们可以显示进程使用系统调用的摘要信息,及使用了多少次系统调用
![](http://s4.51cto.com/wyfs02/M00/89/D4/wKioL1gfIQeDZIYkAAB0DpUajvY785.png)
我们可以看到使用的read,write,open这些系统调用,以及总共产生了多少次系统调用
4)使用-o选项,我们可以将分析结构保存在某个文件中,以供后续分析使用
5) 使用-t(秒)-tt(微秒)-ttt(微秒,时间为UNIX时间戳,即从1970年1月1日起的时间)
![](http://s2.51cto.com/wyfs02/M01/89/D7/wKiom1gfI5WQYlRaAABlcoovD3M658.png)
![](http://s4.51cto.com/wyfs02/M01/89/D7/wKiom1gfI8rRmSnqAABgybRB6Mg998.png)
![](http://s5.51cto.com/wyfs02/M02/89/D4/wKioL1gfI5aziDGQAABkL4rIVRM409.png)
gdb:
<1>gdb命令说明
gdb是Linux下及UNIX下的程序调试工具,我们可以启动程序,让程序按照我们的需求来自由的运行
<2>gdb使用attach,后面跟着我们的pid信息,查看我们的进程状态
![](http://s3.51cto.com/wyfs02/M02/89/D5/wKioL1gfL2LiX0aeAABLO5Haedw239.png)
如果想知道程序现在运行到了哪里,同样可以使用“backtrace”命令。当然也可以使用“step”命令对程序进行单步调试。在完成调试之后,不要忘记用detach命令断开连接,让被调试的进程可以继续正常运行。
gdb是个很复杂的工具,一般Linux下的C开发程序员会用到的比较多,这里就不做深入探讨了
相关文章推荐
- Linux 下用gdb单步调试多进程方法.
- Linux strace进程追踪工具
- Linux内核分析-使用gdb跟踪调试内核从start_kernel到init进程启动
- Linux调试工具strace和gdb常用命令小结
- linux下使用gdb调试多进程多线程
- linux gdb 进程调试
- linux 调试利器gdb, strace, pstack, pstree, lsof
- linux 调试利器gdb, strace, pstack, pstree, lsof
- linux 环境下 gdb 附加进程调试程序
- Linux:如何使用gdb调试多进程多线程程序
- 基于Linux调试工具strace与gdb的常用命令总结
- linux 调试利器gdb, strace, pstack, pstree, lsof
- Linux调试工具strace和gdb常用命令小结
- linux 下 Gdb 调试多进程的方法
- Linux 下用gdb单步调试多进程方法.
- 基于Linux调试工具strace与gdb的常用命令总结
- 学习笔记 --- LINUX 应用调试之使用strace命令追踪系统调用
- linux 调试利器gdb, strace, pstack, pstree, lsof
- [Linux]gdb调试多进程多线程例程
- 【Linux】使用gdb调试多进程多线程程序