记录本人在写服务器项目时,调试过程中用到的几个命令。
1、ping
用于检测一个主机网络功能的可用性,以及网络的连接速度。其原理为:使用ICMP协议,向指定的网络地址发送一定数据长度的数据包,若网络地址存在且网络功能没有问题,就会返回同样大小的数据包,若在超时时间内没有返回,也会返回对应的错误信息。
格式:
ping 主机IP
例如:在终端输入ping 127.0.0.1(127.0.0.1为本地环回地址,常用于本机模拟通信测试),结果无误,如下:
ping命令的详解可参考博客:https://blog.youkuaiyun.com/hebbely/article/details/54965989。
2、tail
用于查看文件内容,与cat不同的是,tail可以查看正在改变的文件内容,常用于实时更新的日志文件中。
格式:
tail -f filename
3、nc
常用于模拟一个客户端,向服务器发送数据,并返回数据,用来测试服务器的性能。
格式:
nc 主机ip 端口号
举例:本机有一个服务器(端口号为6666),终端输入nc 127.0.0.1 6666,建立连接后,输入数据发送给服务端,并返回大写的数据,如下:
客户端:
服务端:
4、netstat
用于查询网络套接字的连接情况,接口状态,显示路由表信息等。
格式:
netstat -参数
比如:我要查看本机服务器端口6666上的套接字连接情况,终端输入netstat -ntap|grep 6666,结果如下:
结果显示端口6666的服务器上有一个listen监听套接字描述符,以及一个已连接的套接字描述符,同属于进程80529;端口45660的客户端上只有一个已连接的套接字描述符,进程号为80644。可以发现,服务端和客户端是在同一台主机上的,事实的确如此。
5、strace
用于跟踪系统中进程或线程的系统调用,从而调试程序的运行状态。
常用格式:
strace -p 进程号/线程号
举例:本机开启了一个多线程服务端,主线程80733,子线程80734、80735
在终端输入:sudo strace -p 80733,可以看到主线程正阻塞在epoll_wait上,等待事件发生。
最后讲一下,本人调试服务器的过程中,遇到的一个问题,我要创建的是一个多线程池,结果发现在创建第一个子线程的时候,程序阻塞了无法向下执行,也无法接受新连接,其日志消息如下图所示:
于是我在终端中调试线程80870,输入:sudo strace -p 80870,结果如下:
很明显线程80870出现了错误,错误就是:FUTEX_WAIT_PRIVATE,即线程发生了死锁情况,于是我利用日志消息判断线程建立的过程中可能发生死锁的地方,最后确定线程在cond_.signal()处发生死锁,即没有解锁,无法执行loop_->loop()。
逻辑上此处不可能发生死锁,最后一步一步发现是线程锁写错了,把解锁(pthread_mutex_unlock)写成了加锁(pthread_mutex_lock),导致锁的临界区结束时,本该解锁结果又加了一次锁,就导致了死锁。
把这个问题改正后,重新编译并启动服务器后,可以看到服务器运行结果如下,
可以看到要创建的两个子线程81072、81073都创建完成其事件循环也在运行,主线程的事件循环也在运行等待新连接,服务器初始化状态无误。
6、ps
用于查询当前时刻进程运行情况,常用参数如下:
-A :所有的进程均显示出来
-a :不与terminal有关的所有进程
-u :有效用户的相关进程
-x :一般与a参数一起使用,可列出较完整的信息
-l :较长,较详细地将PID的信息列出
常用的参数搭配使用方法:
ps aux # 查看系统所有的进程数据
ps ax # 查看不与terminal有关的所有进程
ps -lA # 查看系统所有的进程数据
ps axjf # 查看连同一部分进程树状态
7、top
用于监控linux系统系统状况,实时显示各个进程的资源占用情况,内存使用情况以及进程运行时间等等。
具体详解:Linux中top命令参数详解Linux中top命令参数详解。