最近遇到很多童鞋,在自己學習開發(fā)的時候,順利的時候還好,一遇到問題就無處下手,今天大智給你分享一下自己的“破案術(shù)”,讓你解決問題不再迷茫。
這一節(jié)主要講在Unity編輯器中的問題解決方法,發(fā)布后的程序(如PC端、WebGL、Andnroid、iOS等)出現(xiàn)異常、崩潰等情況,后面再專門寫文章去探討。
解決問題一般分為幾步:
1、觀察表現(xiàn),收集線索,復(fù)現(xiàn)問題
2、推測問題所在位置
3、嘗試修改并驗證
4、驗證是否引入了其他問題
1、觀察表現(xiàn),收集線索,復(fù)現(xiàn)問題
收集線索是解決問題最重要的一步,有了線索就可以抽絲剝繭,定位問題。
收集線索通常也是最難的一步,原則是:不放過任何信息,將問題復(fù)現(xiàn)。
對于英文信息,你要搞明白英文信息的含義。
一般線索從以下幾個渠道搜集:
相關(guān)提示信息
報錯信息
日志信息
運行表現(xiàn)
近期修改的代碼
相關(guān)提示信息
相關(guān)提示信息包括各種彈出框、界面上的信息/警告等等。
很多同學對這些信息視而不見,命名彈出框已經(jīng)明確告訴你缺少XXX東西了,但是你看都不看就給它關(guān)掉了。我太難了。
比如下圖Unity打包Android時的提示:
上面這個提示,只要你把英文看明白,就知道原因是什么,解決辦法是什么。
報錯信息
很多時候出現(xiàn)問題會有報錯或者異常信息,這是非常好的線索。因為報錯/異常通常很具體,而且很多可以定位到具體的代碼位置。
對于報錯信息一定要完整的瀏覽,不要只看一句報錯的概要。
完整的報錯信息可能包含:報錯的概要信息、詳細信息、調(diào)用堆棧等等。
有些時候在有異常的時候,異常信息中已經(jīng)包含了解決異常的辦法,一定要仔細去看。
日志信息
日志信息是在運行過程中產(chǎn)生的信息,通常是使用
Debug.Log
Debug.Warn
Debug.Error
等輸出的內(nèi)容。
日志信息雖然不能直接定位到錯誤的位置,但是可以看到運行出錯之前運行的情況以及對應(yīng)的代碼行。
注意日志信息都是你自己寫代碼時加的,所以記得在關(guān)鍵位置,或者覺得直覺上容易有BUG的地方保留一些日志。
運行表現(xiàn)
運行表現(xiàn)也就是程序運行中,出現(xiàn)問題時的表現(xiàn)。
運行表現(xiàn)是比較表面的線索,這需要你對代碼比較熟悉,才能定位到相關(guān)的代碼。
近期修改的代碼
如果之前運行沒有BUG,在修改過某些代碼之后出現(xiàn)了錯誤,就需要著重去排查近期修改的代碼中引入的問題。
很多同學說過這樣的話:“我什么都沒動,昨天還好好的,今天就跑不起來了”。
這話你信么?
我信,不過只有5%的可能是因為運行環(huán)境或者服務(wù)器出現(xiàn)的問題,95%還是你不經(jīng)意間改了什么東西導(dǎo)致的。
如果是你不經(jīng)意間改了什么東西,這個問題還是挺難找的。最好的解藥就是版本控制。
一定要做好版本控制,否則你一次不經(jīng)意間的修改可能會浪費掉一周的時間來DEBUG。
2、推測問題所在的位置
比如有報錯/異常信息、日志信息的時候,基本上可以直接定位到有問題的代碼行,這樣就比較簡單。
還有很多時候沒辦法定位到具體的代碼,那該怎么找到出問題的位置呢?
通常有幾種方式:
加Log
斷點調(diào)試
添加/刪除代碼法
斷點調(diào)試
斷點調(diào)試是一個非常常用的工具,適用于大部分可復(fù)現(xiàn)的問題。
通過在代碼編輯器中打斷點,一步一步執(zhí)行,可以清楚的看到每一步執(zhí)行后的結(jié)果。
斷點調(diào)試也是一個比較大的話題,后面咱們在開一篇去探索一下。
斷點調(diào)試不太適用的情況有:循環(huán)和多線程。
加Log
不斷加Log,直到能定位到出問題的地方。在循環(huán)和多線程中出現(xiàn)的問題,加Log這種方法也能有很好的表現(xiàn)。
如果問題是100%復(fù)現(xiàn)的,那就比較好辦了??隙芏ㄎ坏絾栴}所在的位置。如果是偶爾出現(xiàn)的,這種問題最難發(fā)現(xiàn),只能不斷加Log,期待它下次出現(xiàn)時能抓到他。
刪除/添加代碼法(二分法)
在遇到非常復(fù)雜的情況時,可以通過定位大概的范圍,然后通過二分法刪除/添加代碼來定位問題。
具體步驟很簡單:
先刪除一部分代碼,看看執(zhí)行是否如預(yù)期。如果還有問題繼續(xù)刪代碼。
如果運行代碼正常了,可以分批往里面添加代碼,直到問題出現(xiàn)。
在刪除添加的時候可以使用二分法來提高效率。
3、嘗試修改并驗證
改BUG這個就不用說了,定位到問題,也知道問題所在。
如果還不知道怎么改,這篇文章就幫不了你了,因為問題可能千變?nèi)f化。
可以根據(jù)線索信息去網(wǎng)上搜索或者找人請教。只要不是疑難雜癥,網(wǎng)上大部分都能搜到。
修改完后驗證是否解決了問題。如果沒有解決或者出現(xiàn)了其他問題,請繼續(xù)解決。
4、驗證是否引入了其他問題
最后,也是很多同學容易忽略的一個環(huán)節(jié),叫做回歸測試。
改完了一個BUG,興沖沖的提交代碼,打包發(fā)布,殊不知引入了一個更致命的問題。
在修改完BUG之后,一定要測試,或者給測試同學測試,或者跑自動的測試用例。
總結(jié)
好,以上就是大智的一些“破案術(shù)”,在遇到問題時,你可以按照上面的思路來干掉BUG。