Linux下,多線程程序死循環問題調試
當你的軟件在某個時刻停止服務,CPU占用達到100%+,這種問題一個可能的原因是產生了死循環,假設程序某處存在潛在的死循環,并在某種條件下會引發,本文以一個示例來定位出現死循環的位置。當程序某處存在死循環,通常定位問題及縮小范圍的方法是,在可疑的代碼處加log,或者注釋掉可疑代碼,這對于容易重現問題的程序來說還好,但對于“偶爾”才會產生問題程序卻很難調試,因為我們很難重現程序故障。本文所述的調試過程正是在這種情況下,假設問題已經出現,我們要求環境保護現場,即出問題的程序還在運行中。
1.我們首先要知道是哪個線程出了問題:
首先查一下出問題進程的pid,例如




top -H -p 11065











2.接下來,我們用gdb來attach目標進程
執行: gdb icdn 11065
在gdb中,列出線程狀態:












gdb已經列出了各線程正在執行的函數,我們需要更多信息,記住11073對應的行首標號,這是gdb為線程分配的id,這里為2,然后執行切換:





bt一下:






來看一下101行的代碼:















現在我們定位到了出問題的代碼位置,這里的循環只用來演示的。
最后別忘了detach
posted on 2010-08-02 12:08 葉子 閱讀(7509) 評論(2) 編輯 收藏 引用 所屬分類: C\C++