前言
前几个月换了一个新工作,Windows端完全转入了Linux服务器端,语言也彻底变成了C,偶尔夹杂着C 。对于我来说,之前的Vxworks,Qt,VS之类的IDE之下的调试定位也完全都没用了,最近一直在做提测项目,对问题定位,查找问题也有了一定的了解。 在这简单说一下,最近的定位调试命令。
端口分析命令
代码语言:javascript复制lsof -i:PortID //查看端口使用情况,被那个进程占用,占用协议,是否有等待,来判断端口是否阻塞,等等
代码语言:javascript复制lsof -p PID //查看PID进程进行的一些操作,查看是否有违规的,死锁,等等其他违法操作。也可以用来查看是否有句柄泄露等问题,看句柄数量即可。
CPU占用率过高,进程死循环或者死锁问题
代码语言:javascript复制top //不复述了,可以查看虚拟内存,实际使用内存,CPU占用率,内存占用率等,如果看到CPU单核占用率接近100%,也可以很明确断定是程序异常死循环问题导致。
代码语言:javascript复制top -H -p PID //查看某一个进程下的所有子线程,查看每个子线程的这个属性,如果有某一个或者多个子线程CPU占用率过高,着重分析
代码语言:javascript复制pstack pid >> pid.txt //将pid栈重定向到pid.txt,拿到txt后分析,死锁原因
如果进程过多,可以考虑写一个简单脚本来操作。
代码语言:javascript复制pmap -p <pid> //查看运行中动态链接库
死锁问题定位
在运行进程为多线程情况下,定位死锁问题。
代码语言:javascript复制gdb -p pid //挂载Gdb调试
attach -p //依附于某一个进程
thread apply all bt //查看所有线程栈信息
thread id //转到某一个线程
f id //查看线程某一步骤的详细信息
p lock //打印锁信息 owner 即可看到锁被哪一个进程占用,定位死锁信息
网络问题查看
代码语言:javascript复制iftop -p //查看当前服务器下所有网络端口流量情况
iftop -p eht_name //查看指定网口网络流量情况
iperf3 -s -i 1 -d //客户端
iperf3 -c service.ip -i -1 -t 20 -d //服务端 网络流量交互情况,延时1S,20个包
其他命令
代码语言:javascript复制ps -ef
ps -T -p pid
ps -ef |grep
tail -f "file_name" |grep
df -h
df -H
ll --full-time //显示全部时间
grep -r "str" find-path //查询文件内容分