天天看點

使用 Strace 和 GDB 調試工具的樂趣

編寫 UNIX® 系統程式充滿樂趣,并且具有教育意義。使用 UNIX strace 工具和 GDB(GNU 項目調試工具),您可以真正地深入研究系統的功能,并了解組成這些功能的各種各樣的程式。同時使用這兩種工具,能夠在檢視 UNIX 計算機底層資訊 的時候,給您帶來更好的體驗。

UNIX 家族總是為使用者提供了豐富的工具。UNIX 是一個工具财寶箱,有了這些工具,您不僅可以完成具有創造性的工作,還可以在深入研究該作業系統的同時得到教育和娛樂。strace(用來跟蹤任何程式的系統調用)和 GDB 調試工具(用來在受控的環境中運作程式的功能齊全的調試工具)是實作這個目标的兩個有價值的工具。

UNIX 的設計由大量的函數調用(稱為系統調用)組成,其中包括一些簡單的任務,如在螢幕上顯示字元串來設定任務優先級。所有的 UNIX 程式都是通過調用作業系統提供的這些底層服務來完成它們的任務,使用 strace 工具,您可以清楚地看到這些調用過程及其使用的參數。通過這種方式,您可以操作這些程式,以了解它們與作業系統之間的底層互動。

讓我們以一個簡單的 UNIX 指令 <code>pwd</code> 作為開始,然後更深入地研究該指令在完成其任務的過程中進行了哪些工作。啟動 xterm 以建立一個進行實驗的受控環境,然後輸入下面的指令:

這個 <code>pwd</code> 指令顯示了目前的工作目錄。在我的計算機上,當時的輸出是:

一個如此簡單的函數掩飾了該指令底層的複雜性(順便說一下,所有的計算機程式都是這樣的)。要真正地了解其複雜性,請使用 strace 工具再次運作 <code>pwd</code> 指令:

<a href="http://www.ibm.com/developerworks/cn/aix/library/au-unix-strace.html#ibm-pcon">回頁首</a>

您所看到的應該是 <code>getcwd()</code> 函數完整的清單以及這個重要的 <code>C</code> 函數需要的和傳回的參數清單。同樣地,您可以輸入 <code>man brk</code> 或 <code>man fstat64</code>等等。通常,UNIX 系統通過文檔對這些系統函數進行了詳細的說明,如果花些時間仔細地研究它們,您将逐漸地了解到 UNIX 的功能是多麼的強大,以及學習這些底層系統細節是多麼的容易。在所有的作業系統中,UNIX 最善于幫助您了解其底層的處理過程。

對于下面幾個步驟,您需要使用更龐大且更複雜的程式,而不是像 <code>pwd</code> 這樣簡單的 UNIX 指令。簡單的超文本傳輸協定 (HTTP) 伺服器,如 nweb,是非常适合的。當您在 Internet 上沖浪 的時候,HTTP 伺服器偵聽浏覽器請求,然後通過發送所請求的對象,如 Web 頁面和圖形檔案,以此響應浏覽器的請求。

注意:我假設您需要為 Linux® 工作站編譯這個程式。如果實際情況并非如此,那麼有關在其他的 UNIX 作業系統上對該程式進行編譯的詳細資訊,請閱讀這篇 nweb 文章。

最後,要确認 nweb 确實正在運作并且狀态正常,可以在您的計算機上啟動一個 Web 浏覽器并在位址欄中輸入 <code>http://localhost:9090</code>。

請注意,在調用網絡 <code>accept()</code> 函數的過程中停止了跟蹤操作。在浏覽器中重新整理幾次 <code>http://localhost:9090</code> 頁面,請注意每次重新整理該頁面時 strace 的顯示。這是不是很棒呢?您所看到的是,當 Web 浏覽器調用 HTTP 伺服器 (<code>nweb</code>) 時,伺服器所進行的底層網絡調用。簡單地說,<code>nweb</code> 正在接受 來自您的浏覽器的調用。

您可以在運作 strace 的具有視窗焦點的 xterm 中按下 Ctrl+C 以停止對網絡調用的跟蹤。

正如您所看到的,strace 可以作為了解使用者程式如何通過某些系統調用與作業系統進行互動的一個很好的程式。GDB 調試工具本身也可以附加于一個正在運作的程序,并幫助您進行更深入的研究。

<code>-quiet</code> 選項告訴 GDB 調試工具僅顯示其提示符,而不要顯示所有其他的啟動資訊。如果需要顯示額外的文本資訊,可以去掉 <code>-quiet</code> 選項。

反彙編清單顯示了該 <code>main</code> 函數的彙編語言清單。在本示例中,彙編代碼訓示出運作該代碼的計算機使用的是 Intel® Pentium® 處理器。如果該程式運作于不同類型的處理器上,如基于 IBM Power PC® 的計算機,那麼您的代碼看上去将有很大的差別。

此時,GDB 調試工具已設定為在 nweb 伺服器接受 浏覽器請求處進行中斷,該調試工具将僅僅顯示相應的請求并繼續處理其他的請求,而不會中斷正在運作的程式。重新整理幾次浏覽器中的 <code>http://localhost:9090/</code> 頁面,可以觀察到,GDB 調試工具顯示了斷點并繼續運作。

請注意,您正告訴 GDB 調試工具停止對一個仍在記憶體中活動的程式的調試。即使是在退出了調試工具之後,您還可以重新整理浏覽器頁面,并将看到 nweb 仍在運作。可以輸入 <code>kill 4009</code> 指令來停止該程式,或者在您退出會話時,該頁面将會消失。

和平常一樣,您可以通過其 man 和 info 頁面來了解各種各樣的工具,如 strace 和 GDB 調試工具。請確定使用 UNIX 為您提供的這些工具!

了解關于您所使用的計算機的盡可能多的資訊,絕不是件壞事,并且還可以從這個過程中獲得樂趣。實際上,UNIX 通過提供各種工具,如 strace 和 GDB 調試工具以及包含在相應的 man 和 info 頁面中的大量的資訊,鼓勵您對系統進行研究和學習。計算機是人類智慧的延伸,并且我們對其了解得越多,它們将變得越有用。