本節書摘來自華章計算機《effective debugging:軟體和系統調試的66個有效方法》一書中的第2章,第15節,作者[希]迪歐米迪斯·斯賓奈裡斯(diomidis spinellis),愛飛翔 譯,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
我們所要調試的代碼之是以會出bug,通常并不是由于它使用的第三方程式庫或應用程式本身有問題(參見第14條),而是因為它使用這些第三方元件時所采取的方式有誤。
這種情況并不令人驚訝,由于這些軟體本身是作為黑盒來與你所寫的代碼進行內建的,是以,你不太可能在它們之間互相協調。對于這類問題來說,有一個很有用的辦法,就是去檢視第三方程式庫、中間件甚至是底層軟體的源代碼。
首先,如果想查明某個api為什麼沒有像你所期望的那樣運作,或是想查明某條奇怪的錯誤消息是從哪裡發出來的,那麼可以浏覽第三方元件的源代碼,并搜尋其中你所感興趣的那一部分,以尋求答案。如果想對某個與程式庫有關的功能進行調試,那麼可以在第三方代碼中尋找相關函數或方法的定義,然後由此繼續向下檢視。在檢視第三方程式庫的代碼時,我們可能并不是要在其中尋找bug,而是想更好地了解它的工作原理以及它與你所寫的代碼之間的配合方式。如果想知道某條錯誤消息是從哪裡來的,那麼可以在整個代碼庫裡面搜尋這條消息,并檢查有哪些代碼會發出這條消息(參見第23條和第4條)。為了能夠迅速地查詢函數或方法,我們可以用ctags或etags程式為代碼編制索引(大多數編輯器都支援這兩個程式所輸出的索引),也可以采用內建開發環境(ide)來檢視代碼。與ctags相比,ide能夠更好地處理複雜的語言特性,如重載、覆寫以及模闆等,而ctags的優勢則在于支援的語言數量比較多,5.8版本支援41種語言。在存放源代碼的目錄裡面運作下面這條指令,可以給其中的所有檔案建立索引:

如果你所使用的第三方元件是開源的,那麼也可以通過black duck open hub code search這樣的托管服務來進行搜尋。
還有一種更為強大的調試技術,需要我們先建構帶有調試資訊的第三方元件(參見第28條),然後把自己的代碼與這個調試版的第三方程式庫相連結。這樣,我們就可以像調試自己的代碼那樣,輕松地在第三方程式庫的代碼裡面進行單步調試了,而且我們還可以使用符号調試器(symbolic debugger,參見第4章)來檢視其中的變量。請注意,某些廠商(如microsoft)在發行其代碼的時候,會把供調試所用的版本或帶有符号的版本也随着普通版本一起釋出出來,這樣我們就不用自己去建構包含調試資訊的程式庫了。
如果bug确實是由第三方代碼而非自己的代碼所引起的,那麼在能夠通路其源代碼的前提下,你可以對此進行修改。請注意,隻有在極其特殊的情況下,才需要使用這種辦法,也就是說,隻有在既找不到合理的權宜方案又聯系不到廠商來對此進行修複的時候,才可以考慮修改第三方程式庫的源代碼。一旦你這麼做,就必須在整個應用程式的生命期内,對該程式庫的所有後續版本都做出相應的修改。此外,你還需要保證這樣的改動不會違背相關的法律條款。例如,某些廠商在釋出代碼的時候,會在其協定中要求“隻能看,不能改”(look, don’t touch)。對于開源軟體來說,比較合理的一種做法,是将修改後的代碼送出給負責該代碼的項目,而且從道理上來講,你也确實應該這麼做。如果項目托管在github上,那麼隻需要發起pull request就可以了。
要想運用上面提到的技術,我們必須先擷取到第三方元件的源代碼。如果第三方程式庫或應用程式是開源的,那麼很簡單,隻需要點一下按鈕,就可以把源代碼下載下傳下來了。對于開源的作業系統發行版,還可以把源代碼作為軟體包來下載下傳,例如,在debian linux系統中,我們可以通過以下指令安裝c語言程式庫的源代碼:
此外,很多軟體開發平台也會将其源代碼中較為重要的那一部分,安裝到你的系統上面。例如,microsoft的visual studio會把c語言運作時庫的源代碼放在vccrtsrc裡面,而java development kit(jdk)則會把源代碼放在名為src.zip的壓縮檔案中。對于其他一些第三方軟體來說,你可以在訂購軟體時支付額外的費用以擷取其源碼。隻要售價不高,我們就應該考慮這麼做,若是等以後再去買,則要花很多時間來安排款項,而且還要下訂單并執行所需的合約。等到那個時候,軟體廠商或許已經不再支援你所使用的版本了,甚至有可能已經停業了。是以,我們應該考慮提前擷取這些專有軟體的源代碼,以免出現此類問題。
如果你依賴某個第三方元件,那麼就應該擷取其源代碼。
通過檢視第三方元件的源代碼探尋與第三方api及一些奇怪的錯誤消息有關的問題。
要和第三方程式庫的debug版本相連結。
隻有當其他辦法都不可行的時候,才需要對第三方的源代碼進行修改。