本節書摘來自華章計算機《effective debugging:軟體和系統調試的66個有效方法》一書中的第2章,第18節,作者[希]迪歐米迪斯·斯賓奈裡斯(diomidis spinellis),愛飛翔 譯,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
jenny和mike在談論各自的調試經曆。jenny說:“我不喜歡在客戶的計算機上面工作,要用的工具都沒裝,浏覽器裡也沒有我收藏過的書簽。這真是太麻煩了。我通路不了自己的檔案,計算機上的按鍵綁定和快捷鍵,設定得也都不對。”mike驚訝地看着她說:“快捷鍵?你還有快捷鍵可用,這都算不錯的了。我調試的那台計算機,連鍵盤都沒有!”
如果你在工作時無法使用自己配置好的這台計算機,那麼工作效率确實會大幅降低。除了jenny抱怨的那些事情,還會出現其他一些瑣碎的問題,例如,連接配接網際網路或内部網絡時受到限制、計算機的配置方式不符合習慣(其中既包括螢幕與座椅等設施的位置,也包括滑鼠與鍵盤等裝置的選用)、必須經過長途跋涉到達氣候濕熱(或寒冷)的偏遠地點,以及計算機性能過低等。這些問題目前都特别常見,而且考慮到業界對移動裝置及物聯網的熱情,它們以後還會更加普遍。在很多情況下,你都必須離開自己所習慣的這台高端計算機,例如,要調試手機app,要調試帶有嵌入式軟體的裝置,要解決隻會在客戶的計算機上面出現的問題,或是要處理資料中心裡面的緊急狀況等。在這些情況下,其實你依然有辦法可以繼續使用自己所熟悉的鍵盤,隻不過你要提前做好準備。
對于手機app和某些嵌入式裝置來說,我們可以在計算機上面通過裝置模拟器(device emulator)來調試有問題的應用程式。然而從調試的角度來看,這種方式除了可以提供一些先進的日志記錄功能,并不會給我們帶來太大的幫助。有了模拟器之後,确實不需要再觸摸手機螢幕上的鍵盤了,可是我們無法在模拟器裡面運作符号調試器。比較好的一點是,我們可以同時在計算機裡面打開模拟器與包含源代碼的編輯器,這樣就能夠在修改完代碼之後迅速看到結果,而不用再将其部署到實際的裝置上面了。
還有一種更為強大的辦法,是建立software shim(軟體楔子),以便将應用程式中較為關鍵的那些部分,放在自己的計算機裡面來運作,為此,我們經常會用到單元測試及mock對象(參見第42條)。這種辦法雖然不能夠使用圖形界面,但是卻可以把一些棘手的算法輕松地包含進來,這些算法需要進行大量的調試才能夠處理好。我們可以在應用程式的算法裡面設定挂鈎,将其關聯到某種簡單的(如基于檔案的)輸入/輸出上面,這樣就可以在自己的計算機上面直接編譯并運作源代碼了,而且稍後也可以借助功能強大的調試器來對其中較為複雜的那一部分進行單步調試。
例如,我們要做一個手機app,把社交網絡上面的朋友照片,導入手機的聯系人中。這個程式有一個比較困難的地方,就是要和社交網站通信,并與手機中的聯系人配對。于是,我們可以寫一個指令行工具來充當shim,該工具的參數是某位聯系人的名字,它會采用facebook/linkedin/twitter等網站的api來擷取相關的資訊,并在其中尋找與該聯系人相比對的資料。等我們把這部分邏輯調試好之後,就可以把它作為一個類,內建到手機app裡面了。請注意,這部分代碼始終都應該能夠作為獨立的指令來運作(例如,可以通過在類中編寫main方法來做到這一點),因為以後如果出了問題,我們可以直接編譯并運作這個指令。
要處理好與遠端通路有關的事宜,以便能夠遠端地解決客戶計算機上面的問題。由于遠端通路通常需要管理者權限和一些專業的技術知識,是以要提前做好準備。盡管有很多作業系統都提供了遠端通路其桌面的功能,但是技術支援人員一般還是願意使用teamviewer等專門的應用程式。此外,還可以考慮在客戶的計算機上面安裝一些可以簡化調試工作的資料和工具。例如,安裝一個檢視器來檢視應用程式中的二進制檔案,或者安裝一個運作跟蹤器。如果一定要在第三方計算機上安裝一款調試工具,那麼筆者會選擇unix的strace或truss指令。順便說一句,像我們這些做it的人,經常會有朋友和家人請我們幫忙去解決計算機問題,在這種情況下,遠端通路也可以簡化問題的解決過程。
目前有很多後端運算,都是通過雲主機提供商所搭建的機制來完成的,它們會提供漂亮的web界面,使得開發者可以在其中進行調試并通路控制台。如果你要調試的伺服器沒有放在這樣的雲主機提供商那裡,而是位于陰冷、嘈雜且不便通路的資料中心,那麼你就得提前做好打算了。由于有些問題發生在與伺服器建立網絡連接配接之前,是以我們通常要使用伺服器自身的螢幕及鍵盤,才能夠解決這些問題。為了免去這種麻煩,可以考慮采購kvm over ip裝置,它能夠通過ip網絡來遠端通路計算機的鍵盤(keyboard)、顯示器(video)及滑鼠(mouse)。如果能夠安裝、配置并測試好這樣一套裝置,那你就可以在自己的桌面計算機上,對遠端伺服器在啟動過程中所出現的問題進行調試。
把裝置模拟器配置好,以便通過計算機螢幕和鍵盤來調試移動app。
搭建shim機制,以便使用自己計算機中的工具來調試嵌入式代碼。
為遠端通路做好準備,以便能夠遠端調試客戶的計算機。
配置kvm over ip裝置,以便調試遠端伺服器上面的問題。