關於極少出現的BUG怎麼辦

2021-05-02 22:21:06 字數 1112 閱讀 3555

剛才看了一篇文章是關於一種10000次才出現一次的bug,用的是設定條件斷點,用vc的話其實也可以直接呼叫debug方面的api。

但是,我有個問題,100000000次才出現一次的bug怎麼辦?

別以為這是天方夜譚,在我的開發中,真真實實的出現過這種情況。當時具體作的專案記不大清了,不過這個問題是關於多執行緒,多公共變數的。我的任務是維護這個相當複雜的產品**。

這個產品算是公司相當穩定的產品了,只有這個bug很奇怪執行10幾天後,會莫名其妙的死掉。當時找了很久都沒有找到bug,不得不用另外乙個軟體在10天重企一下這個服務。

不過我很幸運的找到了這個bug.這個bug的原因是多執行緒時 x++ 這個不是被編譯器翻譯成單條指令,而是三條指令(如下),並非原子性的,在極個別的情況下會出現其他執行緒訪問衝突,讀了錯資料,導致後面越錯越厲害,然後程式崩掉。

#include

int _stdcall winmain(hinstance hinst, hinstance hprev, lpstr, int)

00401016  mov         esp,ebp

00401018  pop         ebp 

00401019  ret         10h 

找到它的方法其實也很常見,就是在崩潰的地方察看呼叫堆疊,不僅是當前執行緒的呼叫堆疊,還有其他執行緒的呼叫堆疊,然後從頭到尾把每個執行緒的流程好好分析一遍。最後,這個bug的狐狸尾巴就露出來了。

其實,這個bug就是乙個變數沒有加鎖導致的,所以規範的**是粉重要粉重要滴~

以下是這兩個視窗的示例,執行緒視窗thread顯示當前程序所有的執行緒,呼叫堆疊call stack視窗顯示該程序所有的函式。

保證這個資料安全還可以用volatile這個關鍵字標示這個資料,因為volatile在多執行緒的時候會告訴編譯器把類似於x++這種語句優化翻譯成一條指令(速度稍慢),但是它就是原子的了,就不會出這種問題了.

可惜的是,當時我們公司為了保證多執行緒的**穩定和節約成本( 主要原因:'( ),release版本是不允許開優化的(其實根本沒有debug版本),這樣,volatile這個關鍵字加不加都一樣了.

模型出現閃爍怎麼辦?

當相機移動物體會出現邊緣抖動和z fighting問題,存在的原因有 1 抗鋸齒 faxx 將抗鋸齒設為8或以上,可有效解決邊緣抖動的問題。2 深度衝突 發生在2個幾乎共面的片面,他們投影在後裁減平面時都會被賦予乙個深度,導致後面移動了相機,深度發生變化,產生z fighting。如何防止深度衝突 ...

遇到概率性BUG怎麼辦

大概測試人員最頭疼的就是遇到偶現的bug了吧!有人說根本不會有偶現的bug,它在某種環境狀態下是必然存在的,但是我們在測試過程中依然會遇到這種問題,那遇到這種問題我們應該怎麼辦呢?首先要確保問題發生時的測試環境和測試步驟沒有發生改變,多操作幾次,看看是否還能再次復現 仔細回憶當時的測試環境和操作步驟...

軟體上線後出現了BUG怎麼辦?新夢想IT

從事it網際網路的人都知道,bug是程式設計師和測試人員最不喜歡面對的東西,很多人對於軟體 現bug這個事情,第一想到的就是測試人員的問題,因為他們都覺得這是測試人員沒有測試出軟體中存在的bug,導致後續軟體上線問題浮出水面。其實,出現bug這種情況是由很多原因造成的,不僅僅是測試人員一方的問題,切...