你的軟件在某個時刻停止服務,CPU佔用達到100%+,這種問題一個可能的原因是產生了死循環,假設程序某處存在潛在的死循環,並在某種條件下會引發,本文以一個示例來定位出現死循環的位置。
當程序某處存在死循環,通常定位問題及縮小範圍的方法是,在可疑的代碼處加log,或者註釋掉可疑代碼,這對於容易重現問題的程序來說還好,但對於“偶爾”纔會產生問題程序卻很難調試,因爲我們很難重現程序故障。本文所述的調試過程正是在這種情況下,假設問題已經出現,我們要求環境保護現場,即出問題的程序還在運行中。
1.我們首先要知道是哪個線程出了問題:
首先查一下出問題進程的pid,例如
然後top命令查看線程信息:
top -H -p 11065
從上面可以看出,出問題線程PID爲11073
2.接下來,我們用gdb來attach目標進程
執行: gdb icdn 11065
在gdb中,列出線程狀態:
gdb已經列出了各線程正在執行的函數,我們需要更多信息,記住11073對應的行首標號,這是gdb爲線程分配的id,這裏爲2,然後執行切換:
bt一下:
來看一下101行的代碼:
現在我們定位到了出問題的代碼位置,這裏的循環只用來演示的。
最後別忘了detach()
調試完指定進程後,可以運行detach命令來讓GDB釋放該進程,該進程得以繼續運行。當回車時,detach不會重複。當執行完detach後,進程和GDB不再相關,GDB可以attach其他進程。