【大牛之路】調試及性能分析的簡單命令

前言

寫簡歷時,很害怕自己沒什麼特點,與別人沒啥區分度,而平時又感覺改bug比較多。。。於是在自我評價一欄大膽的寫上
熱愛trouble-shooting

ChangeLog:
2018-6-10 update vmstat

從此走上被虐之路。。。

正文

因爲我自己主要是Linux 下 C/C++ ,所以enmmm 還是這方面做的比較多。之前也寫過一篇類似的博客,主要簡述的是改bug的思想(見這篇),這篇主要是從實際工具出發,簡單介紹工具的使用及思路。(當然反手一個printf也算是一種工具。。)

主要工具
GDB strace pstack valgrind iotop netstat/ss wireshark/tcpdump
輔助性的
top ps

一運行就段錯誤的。直接生成coredump文件,生成的方法見這篇
如果堆棧的信息完好,可以之間看到問題出在哪裏,一般 print 變量,看看是否是地址越界之類的。

運行起來不動的。
可能是死循環/死鎖。
對於多線程死鎖,建議通過ps 找到pid後, pstack <pid> 可以看到每個線程的調用棧。

GDB的常用命令

ctrl + l 清屏。。恩,很常用
p/print 打印變量
b 行號 在第幾行設置斷點
b 函數名 在函數處設置斷點
r/run 運行程序
c/continue 在斷點停下之後繼續執行
bt 查看堆棧調用
frame 切換棧幀 (funcA調用funcB掛掉,如果是傳參的問題,可能要切到funcA去查看)
info thread 查看線程的信息
thread 編號 切換到指定線程
s/step 下一步–進入函數
n/next 下一步–不進入函數
set arg a1… 設置程序運行時的命令行參數
x 打印變量(格式爲x/nfu n爲正整數表示要顯示內存單元的個數
f表示格式 x 十六進制 d十進制 t二進制
u表示每個內存單元幾字節 b h w g 對應1 2 4 8
set arg a1 a2 設置命令行參數
info register 寄存器名 查看寄存器信息

常用的基本就這些。
對於多線程多進程的調試不怎麼熟悉,以後繼續學習。

對於運行着的程序,可以使用GDB的attach跟蹤上,或者strace也可以跟上,都需要進程的pid,並且具有一定的權限。

運行時的系統性能分析,

I/O的就可以使用iotop(注意要在root下)。
CPU,內存相關的就可以使用top,兩者都可以通過pid來指定進程。
vmstat包含信息很多

procs   -----------memory---------- ---swap-- -----io---- -system-- -----cpu------
r  b    swpd   free   buff  cache   si   so    bi    bo   in   cs   us sy id wa st

proc:進程相關
r表示 對應R狀態的進程 wait to run
b表示 對應D狀態的進程 Uninterruptible

memory:內存相關
swpd:這個指虛擬內存的大小(virtual memory)我覺得這個概念很可能混淆,實際上就是swap分區被使用的大小,可以通過`free`來驗證,兩者相同。
free:同free
buff:同free中buffer
cache:同free中的pagecache

swap:對swap區IO
si:從磁盤(swap區)換到內存
so:從內存換到磁盤(swap區)

io:針對塊設備的統計
bi:從塊設備讀的塊數
bo:寫到塊設備的塊數
in:每秒中斷數
cs:每秒上下文切換數

cpu:cpu相關的
us:在用戶態執行時間佔比
sy:在內核態執行時間佔比
id:閒置時間佔比
wa:等待IO時間佔比
st: Time stolen from a virtual machine

文件相關的:lsof filename查看指定文件被哪個進程打開了,查看指定進程打開了哪些文件 lsof -p pid

網絡相關的:查看端口被佔用lsof -i:port或者netstat -anp | grep port 查看網絡連接ping 查看網卡信息ifconfig (看似無用,在虛擬化時/網絡編程ip綁定時有大學問) 還有各種抓包的就是wireshark/tcpdump 調試服務端時可以用nc來作爲簡單的客戶端

磁盤相關的:最簡單的看看磁盤是不是滿了df -h

還有一些雜項

查看內存泄露 valgrind --tool=memcheck --leak-check=full ./a.out

就想到這麼多吧,有新的思路和工具繼續更新

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章