在乙個任務中使用多執行緒程式設計,程式執行一段時間後就佔滿了cpu,嚴重拖慢了系統的執行速度。這裡所說的高cpu,意思就是乙個執行緒占用了乙個cpu的大部分執行時間,如果是單核的cpu,表現為cpu占用近100%;相應的雙核的話乙個執行緒會佔到50%的cpu。
我的電腦是雙核四執行緒的cpu,所以當乙個執行緒死迴圈的時候會占用掉25%的cpu時間。具體表現為:執行程式的最開始表現正常,隨後會看到cpu占用上公升至25%、50%、75%等,再加上本來的業務占用的cpu,可能就把整個cpu佔滿了,這樣系統速度就被拖慢了,甚至導致系統宕機。在這樣的情況下我用windbg attach到目標程序,並通過!runaway命令來列出各執行緒所耗費的時間。占用時間最多的就是那些假死的執行緒了,然後~*kb列出各執行緒的呼叫棧,分析一下耗費時間長的執行緒的呼叫棧,使用bp在呼叫堆疊中的函式設定斷點(bp設定斷點,bl檢視設定的所有斷點),看到底在哪個函式發生了死迴圈。
回到我的程式,從呼叫棧上並不能明顯看出問題:乙個執行緒「卡」在recv上,另乙個「卡」在select上面;但也不應該耗費如此多的cpu時間。再看一下**,外層有乙個while死迴圈,用於處理client發過來的資料,問題基本實在這個while迴圈裡面。再後來,仔細閱讀**後發現原因如下:
這樣處理之後,執行緒佔滿cpu的問題就得到解決了。由於一些原因,這裡沒有把實際情況下的一些分析資料貼出來。
p.s. 使用process explorer也能簡單排查問題執行緒。雙擊程序可以檢視程序的屬性,然後選擇「執行緒」選項卡,雙擊高cpu的執行緒就可以看到呼叫棧了。
使用Windbg尋找高CPU占用執行緒
在乙個任務中使用多執行緒程式設計,程式執行一段時間後就佔滿了cpu,嚴重拖慢系統執行速度。這裡所說的高cpu,意思就是乙個執行緒占用了乙個cpu的大部分執行時間,如果是單核的cpu,表現為cpu占用近100 相應的雙核的話乙個執行緒會佔到50 的cpu。我的電腦是雙核四執行緒的cpu,所以當乙個執行...
用 WinDbg 診斷CPU占用高
2.安裝windbg,這個就不贅述了。需要注意的是有 windbg x64 和 windbg x86 兩個,應該按dmp檔案 的伺服器開啟。3.按 ctrl d 開啟 dmp 檔案,注意直接點那個工具欄上的開啟檔案的圖示是錯誤的。4.載入 sos.dll 檔案。這個最好是直接把 dmp 檔案 伺服器...
如何使用Windbg 查Cpu飆公升問題
2 開啟windbg 設定 file symbol search path 位址如下 c symbols srv c mylocalsymbols srv c mysymbol 3 開啟windbg 將程序轉存的程序檔案 拉進windbg 4 在windbg介面 輸入載入命令 load c wind...