前言
前幾個月換了一個新工作,Windows端完全轉入了Linux服務器端,語言也徹底變成了C,偶爾夾雜着C++。對於我來說,之前的Vxworks,Qt,VS之類的IDE之下的調試定位也完全都沒用了,最近一直在做提測項目,對問題定位,查找問題也有了一定的瞭解。
在這簡單說一下,最近的定位調試命令。
端口分析命令
lsof -i:PortID //查看端口使用情況,被那個進程佔用,佔用協議,是否有等待,來判斷端口是否阻塞,等等
lsof -p PID //查看PID進程進行的一些操作,查看是否有違規的,死鎖,等等其他違法操作。也可以用來查看是否有句柄泄露等問題,看句柄數量即可。
CPU佔用率過高,進程死循環或者死鎖問題
top //不復述了,可以查看虛擬內存,實際使用內存,CPU佔用率,內存佔用率等,如果看到CPU單核佔用率接近100%,也可以很明確斷定是程序異常死循環問題導致。
top -H -p PID //查看某一個進程下的所有子線程,查看每個子線程的這個屬性,如果有某一個或者多個子線程CPU佔用率過高,着重分析
pstack pid << pid.txt //將pid棧重定向到pid.txt,拿到txt後分析,死鎖原因
如果進程過多,可以考慮寫一個簡單腳本來操作。
死鎖問題定位
在運行進程爲多線程情況下,定位死鎖問題。
gdb -p pid //掛載Gdb調試
attach -p //依附於某一個進程
thread apply all bt //查看所有線程棧信息
thread id //轉到某一個線程
f id //查看線程某一步驟的詳細信息
p lock //打印鎖信息 owner 即可看到鎖被哪一個進程佔用,定位死鎖信息
網絡問題查看
iftop -p //查看當前服務器下所有網絡端口流量情況
iftop -p eht_name //查看指定網口網絡流量情況
iperf3 -s -i 1 -d //客戶端
iperf3 -c service.ip -i -1 -t 20 -d //服務端 網絡流量交互情況,延時1S,20個包
其他命令
ps -ef
ps -T -p pid
ps -ef |grep
tail -f "file_name" |grep
df -h
df -H