利用srace和pstack调试应用程序
一、strace的使用和实战
Linux中有两个命令strace和ltrace可以查看到应用程序在运行的过程中所发起系统调用,这对于转码客户端程序来说也适用。下面就这两个命令的使用方法简单总结一下:
在linux系统中可以使用man 这个命令以获取更多的信息
从手册中可以知道
-p pid : 通过进程号来指定被跟踪的进程
-o filename:将跟踪信息指定输出到filename文件中
-f:跟踪该进程fork出来的子进程
-t:输出每一个系统调用的时间戳
-T:输出每一个系统调用所耗费的时间
那接下来使用一个实例来进行试验
1. 首先使用ps命令查看我们应用程序的进程号
2. 选择一个进程号作为我们需要跟踪的进程,上面显示了8个工作进程,为了省去nginx调度的步骤,我在这里只开启一个工作进程,然后使用命令strace的-p选项跟踪
这里可以看到nginx进程停在epoll_wait这个系统调用这里,因为没有客户端在这里请求nginx,所以nginx就阻塞在这里。当然这里可以排除争用accept_mutex锁的情况。
下面就来测试一下,当向nginx发起请求的时候,会怎样处理。
3. 当我开启软件的时候,能够看到输出下面内容
对应上面的内容,有一个简单的解释
3.1 epoll_wait返回值为1,表示有一个描述符时间可读
3.2 accept返回值为3表示的是socket文件描述符
3.3 epoll_ctl表示将返回的socket加入到事件监听机制中
3.4 recvfrom表示从可读的socket描述符3事件中读取数据,等待被读取的数据存在第二个参数中,这里是GET /diskb/dxb/cl_dist/dxb/1.ts,返回值142表示成功读取了142字节数据
3.5 state表示请求的文件是否存在,如果存在则返回0
3.6 open/fstate表示打开并且获取文件状态的信息,返回值10表示一个文件描述符,以后的操作都将用到这个值
3.7 writev表示把响应头通过socket描述符3发送给客户端
3.8 sendfile表示把文件描述符10代表的响应体通过socket发送到客户端
3.9 再往文件描述符4代表的日志文件内write一条日志信息。
3.10 recv看客户端是否还发了其他待处理的请求/信息。
3.11 最后关闭文件描述符3代表的socket套接字。
从上面的内容中可以看到,strace能够提供一些nginx执行过程中一些内部信息和系统调用的过程,所以在出现一些奇怪现象时,比如Nginx启动失败、响应的文件数据和预期不一致、莫名其妙的Segment Fault段错误、存在性能瓶颈(利用-T选项跟踪各个函数的消耗时间),利用strace也许能提供一些相关帮助。最后,要退出strace跟踪,按ctrl+c即可。
二、pstack的使用和实战
命令strace跟踪的是系统调用,对于程序本身的函数调用关系无法给出更为明朗的信息,如果我们发现程序当前运行不正常,想知道程序当前内部到底在执行什么函数,那么命令pstack就是一个非常方便实用的工具。
下面以为例介绍pstack的使用方法
1. 找到对应应用程序id
2. 使用命令pstack 13042
从上图中就能够看到各个线程调用的顺序,注意:使用pstack抓取的堆栈信息是一个动态的,会发生变化,所以绝大多数情况下,需要多次抓取堆栈信息,才能分析出有哪些变化。
利用srace和pstack调试应用程序
最新推荐文章于 2025-04-30 08:45:00 发布