從事 Linux 開發一定要熟悉 GDB

GitChat 精品課發表於2019-04-09

640?wx_fmt=jpeg

本文選自 | 《Linux GDB 除錯指南》

作者 | 范蠡

責編 | Linse


今日調侃:GDB 不難學,還挺能鍛鍊打字速度的,特別是寫 C++ 的時候


我從學生時代到進入軟體開發這個行業,不知不覺已經十餘年了,各種專案使用的伺服器作業系統都是 Linux,開發語言是 C/C++。


正如從事 Windows C/C++ 開發的一定要熟悉 Visual Studio、從事 Java 開發的要熟悉 Eclipse 或 IntelliJ IDEA、從事 Android 開發的要熟悉 Android Studio、從事 iOS 開發的要熟悉 XCode 一樣,從事 Linux 開發的要熟悉 GDB。

GDB 有多重要?分享我的經歷側面回答一下這個問題。

01

熟練使用 GDB 是 Linux C/C++ 開發人員的基本素養

我之前有份後臺開發的工作,部門有個不成文的規定:即使很明確的程式,每個分支必須使用 GDB 偵錯程式去追蹤一下程式,看看執行過程中的各種中間狀態是否符合預期。

很多人想當然地覺得程式碼就會按預期的流程去執行,但是實際上一到生產環境總會出現這樣那樣的問題,這是很多 Bug 產生的原因。在除錯的過程中,能夠學到很多可能想不到的知識。

我開始是做 Windows C/C++ 開發的,後來轉做 Linux C/C++ 開發,剛開始對 Linux 環境下沒有圖形化的視覺化介面很不習慣,因此很多簡單的程式碼段也就不願意去除錯,後來系統事故頻發,造成了一些不好的影響,慢慢地意識到除錯的重要性。

後來,我做了技術管理者,每次面試技術候選人,我會問他熟悉哪些開發工具。有些面試者對各種開發工具都不熟悉,我猜想這類應聘者應該是基本“不寫程式碼”或者“不會寫程式碼”的,面試結果可想而知。

“工欲善其事、必先利其器”,作為一名合格的軟體開發者,至少得熟悉一種軟體開發工具和偵錯程式,而對於 Linux C/C++ 後臺開發,舍 GDB 其誰?

雖然 Linux 系統下大家編寫 C/C++ 程式碼的 IDE 可以自由選擇,但是除錯生成的 C/C++ 程式一定是直接或者間接使用 GDB。

可以毫不誇張地說,我做的所有專案的開發和除錯包括故障排查都是利用 GDB 完成的。除錯是開發流程中一個非常重要的環節,對於從事 Linux C/C++ 的開發人員,熟練使用 GDB 除錯是一項基本要求。

02

熟練使用 GDB 是學習優秀開源專案的一把鑰匙

一些初中級開發者可能想通過閱讀一些優秀的開源專案來提高自己的編碼水平,但是隻閱讀程式碼,不容易找到要點,或者會誤解程式的執行邏輯,最終迷失方向。

如果能實際利用偵錯程式去把某個開源專案除錯一遍,學習效果才能更好。站在 Linux C/C++ 後臺開發的角度來說,學會了 GDB 除錯,就可以對各種 C/C++ 開源專案(如 Redis、Apache、Nginx 等)遊刃有餘

簡而言之,GDB 除錯是學習這些優秀開源專案的一把鑰匙。

另外,由於 C++ 這門語言多型特性的存在,我們看到的程式碼執行脈絡和實際中的執行流程可能會不一樣,特別容易搞錯。

我覺得最好的學習方法就是除錯這些開源軟體,無論多麼複雜的程式,只要可以除錯,就總可以搞得明明白白的。而一些程式的細節,我們可以通過修改原始碼除錯觀察,最終把原理搞得透徹。

03

我的 GDB 學習軌跡

剛開始,我通過網路資料學會了一些簡單的 GDB 命令,這時候我在工作中會刻意找一些 demo 程式去除錯。在除錯的過程中,遇到了一些需要重複操作才能觸發的斷點,在厭倦反覆手工操作以後,學會了臨時斷點、條件斷點和硬體斷點的新增方法。

後來在跟多執行緒程式鬥智鬥勇的過程中,學會了如何在各個執行緒之間切換和檢視當前執行緒呼叫堆疊。辦法總比困難多,在堅持之後,我發現已經找到了能夠搞明白任何 Linux C/C++ 程式的鑰匙。

而這把鑰匙是很多人苦苦尋找的。

我把找到這把鑰匙的經驗彙整合冊,在 GitChat 平臺上釋出了《Linux GDB 除錯指南》,希望能幫助需要的朋友找到自己的鑰匙。

掃碼解鎖 GDB 

640?wx_fmt=jpeg


這個圖文課程共 19 篇,內容由淺至深,詳細地講解了除錯的基本原理和實際專案除錯中各種 GDB 命令的靈活使用。


GitChat 作者

范蠡:資深開發工程師,擔任過 C++ 客戶端和伺服器端開發主程,先後做過網際網路金融交易系統、即時通訊、遊戲伺服器、音視訊直播伺服器等專案,目前在某大型網際網路公司任開發經理一職。


適宜人群

  • 希望學習 Linux C/C++ 開發和系統原理的讀者

  • 希望提高除錯和排障能力的 C/C++ 開發人員

  • 希望學習 Redis 網路通訊模組設計思想的讀者

  • 希望整體把握開源 C/C++ 專案技巧的讀者


點選閱讀原文,免費試讀了解

相關文章