目前,軟體bug一直是程式設計師的夢魘,但其實只要掌握一定的技巧和基本知識, 是可以輕鬆解決掉這些bug的。
1、程式跑一段時間以後會越跑越慢。
2、程式無緣無故crash。
3、程式記憶體越變越大,直至程式crash。
4、程式跑著突然死掉了。
一、定位執行緒。
以上解決問題的關鍵是先定位到程式變慢的**,對於第1、4點,可以先確定是哪個執行緒出了問題, 因此,小弟不才區區在下我編寫了乙個監控執行緒資訊的程式,這在自己的開發還是發揮一些作用的。 介面如下,
load process:可以獲得當前系統的所有程序。
detect:是對被選擇的程序進行監控。
detect下面的列表監控引數如下:
id:執行緒id
name:執行緒入口函式名:
kernel time:執行緒占用的核心時間
user time:執行緒占用的使用者時間
percent:執行緒cpu利用率。
affinity:執行緒的親緣性,即執行緒指定執行cpu引數
由於,用windows api很難獲取執行緒的address,所以需要編寫驅動程式去獲取核心執行緒資訊ethread和kthread,
以上,id、address、kernel time、user time、affinity可以由該驅動去獲得,而name需要配合exe、dll對應的pbd
檔案來獲取,最後percent可以自己利用kernel time和user time來計算大概的cpu利用率。
利用以上工具,可以方便的知道系統到底有幾個執行緒,每個執行緒名稱又是什麼,他們的一些資訊又是怎樣的?
1、在開發過程中有時會發現程式占用太大cpu資源,這時候,你可能苦於不知道是哪個執行緒,那段**出了問題。
現在,你可以使用該工具,它很方便的找到cpu資源高占用的執行緒,然後可以結合**時間計算程式,找到
cpu資源高占用的**。
2、有時程式莫名奇妙跑著會變慢,這時你可以利用該工具看下,到底是哪個執行緒占用比較多的cpu時間,它又是在哪個cpu下執行的。
曾經我就碰到過這樣的問題,最後,我用該工具發現,有兩個執行緒共享乙個記憶體,而它們又分配在不同的cpu下執行,這會導致cpu
的cache無法很有效的利用,這會導致程式在某些作業系統下,會越跑越慢。最後,我用setthreadaffinitymask把兩個執行緒設定
在同乙個cpu,問題居然神奇的解決了。
二、fix變慢問題。
對於變慢的問題,找到了變慢執行緒後,可以利用計算**時間的方法找到變慢的**,從而解決問題。
實戰,問題:directdraw畫圖操作經過長時間執行以後,會變慢。
解決過程:對繪圖操作各個**段加上計算時間的**,發現directdraw在呼叫getdc獲取directdraw dc以後,
直至releasedc這個過程變慢很明顯。然後再進行細化,發現是cdc::fromhandle出了問題。
原因是:cdc::fromhandle會根據傳進去的hdc去查詢mfc已知的hdc+cdc對映表,如果找到則返回對應的cdc,
否則,建立一項對映關係。問題的關鍵在於,該對映表會不斷膨脹,導致查詢速度越來越慢,所以繪圖操作越來越慢。
那為什麼該對映表會不斷膨脹呢?因為,directdraw在不斷釋放和初始化,所以它的getdc會返回不同的hdc控制代碼,
但,directdraw dc釋放後又沒有釋放hdc+cdc對映表對應表項。
經驗教訓:如果**中使用sdk的createdc或getdc,最好不要使用cdc::fromhandle,這會導致mfc的hdc+cdc對映表
不斷膨脹。
三、fix程式死掉的問題。
對於死掉的問題,可能是死鎖導致,首要就是找到死掉的執行緒。
要找到死掉的執行緒,可以遍歷所有執行緒,並把所有執行緒的上下文trace出來,就可以知道到底在哪些執行緒出現了死鎖。
要把所有執行緒上下文trace出來,可以用getthreadcontext函式。
getthreadcontext只能在所在程序生效,這時你可以採用createremotethread的方法把你的getthreadcontext**
嵌入到目標程序,再使用共享記憶體把採集到的thread context傳到源程序。但要記住使用getthreadcontext函式前要先
suspendthread,完了再resumethread。
知道了死鎖的執行緒和位置,就可以分析**,找到死鎖的原因,並解決問題。
未完待續。。。
整理的一些Bug
前言 最近在學c 因為公司要求,以前從沒接觸過c 但是來到這個公司公司的人要我負責c 的乙個工程,所以沒辦法,學唄,難道不是很難,現在的學習環境也很好,直接就上專案,這樣學起來會很快,這篇部落格是將我所遇到的一些bug整理一下,以回顧回顧。1.無法顯示額外的 分析警告或錯誤 在使用vs2005編譯程...
IOCP的一些心得
iocp的工作執行緒的個數一般設定為processors 2 2,這是綜合考慮了工作執行緒可能是等待 掛起 正在執行的狀態。如果你測試出更好的結果,以你的為標準。iocp的工作執行緒由系統排程和優化,不要去干預執行緒的排程,除非你自信能超越系統的排程。在遇到奇怪的問題時,可以嘗試減少iocp工作執行...
Qt 的一些心得
一.背景刷成黑色,前景色設為白色。方法一 paltette方式,經測試,該方法不會影響到其他控制項,推薦使用 qpalette bgpal palette bgpal.setcolor qpalette background,qcolor 0,0 0,255 qpalette background,...