利用 CodeMap 幫助你找出 Event 觸發時的怪異 Bug 現象
前言
在程式開發中 Debug 絕對是我們日常工作中的一環,若 Coding 沒有 Debug 真的很難相信我們的工作是程式開發 XD
而 Debug 中 最麻煩的有兩種!
一種就是 Bug 什麼時候發生的只能靠爻杯,而且 Bug 要來就來要走就走!你想攔都攔不住。
另外一種就是你明明就很肯定這兒子是你和你老婆的,可是生下來的卻是金髮藍眼。1 + 1 = 2 的定律完全沒有用。
圖片來源http://s1.djyimg.com/i6/1105170228341858.jpg
之前有寫一篇 Code Map 的操作說明,這次就拿實際的案例
http://www.dotblogs.com.tw/franma/archive/2013/04/15/101595.aspx
應該只有我的 Method 會觸發吧…
有時候還是別有過多先入為主的觀念在 Debug 上,不然會一直鬼打牆
這裡用了 MultiSelectList 的控制項,而且使用了 Select Mode 的機制。
會啟用 Select Mode 只有 App Bar 上面的 Button 以及 MultiSelectList 控制項點選最左邊 兩個進入點。
一般在操作的情況下都很正常。
但當使用者點選 控制項最左邊 + Location 定位機制時就會發生 Event 莫名地被觸發並設為 false 的詭異現象
被觸發的 Event
要針對這種問題除錯其實不太容易的,一來要對 控制項的生命週期有一定程度的了解,二來你在時間很趕的時候絕對沒空一個一個查。
Code Map 除錯找原因
講了這麼多還是用行動來表示
如同以往 Programmer 直接在 if 的地方設中斷點後
我們就開始進行操作,按下 App bar 的 Cancel 鍵, Select Mode 會被取消
進入中斷點後開啟 Code Map 可以看到的確如之前寫的程式流程一樣被觸發
接著確認 開啟的功能
流程正確沒錯!在即有的程式流程中就是統一透過這兩個 Method 來控制的。
到目前為止都還在計劃當中
當然這個時候執行 Location 定位服務,也不會觸發 Event 。
接下來我們就測試不透過 App Bar 直接點選最左邊區域的方式
ok!合情合理!控制項的 Select mode 改變了,而且是控制項本身觸發並非透過 SelectMode 。
當然在這個模式也要跑一下 Location 定位 (剛剛到 21 ,現在到 23 )
這個時候就神奇了!原本不應該被觸發的 Event 觸發了…
可以看到觸發前最後的動作是 UpdateNearStoreList ,這段的程式壓根就沒有 Select Mode 的設定。
但我很快速地從 Code Map 上就察覺到,這應當是 MultiSelectList 的 IsSelectionEnabled 屬性從控制項觸發 和 程式人員自已 Coding 是兩種不同的行為。
自已 Coding 的是強制啟動,所以不會因為 Databinding 而取消。但從控制項觸發的則是在 DataBinding 之後會回歸到原本的設,所以這個 Event 就會觸發。
修改程式
依照剛剛 Code Map 呈現的圖形,最簡單的做法就是開啟 Select Mode 時就將 Location 定位服務關閉,反之亦然。
再重新驗證一下…
Good !這個 Event 就不會再被觸發了!
心得
是不是超方便的 (灑花)
還在用以前的方式一個一個設中斷點嗎??還在透過 Log 一個一個查歷程嗎??
有了這個 Debug 神兵利器之一,相信整個除錯下來可以大幅減少了很多時間,當然更重要的是讓自已在除錯的時候更了解整個程式的邏輯流程。( 尤其是在接前人的程式時 )
時間就是金錢!後面還有千千萬萬個 Bug 在等著我們呢… (淚)
上一篇文章
http://www.dotblogs.com.tw/franma/archive/2013/04/15/101595.aspx