本書通過63個真實案例,以故事形式深度聚焦軟件調試這一關鍵技術,直面發(fā)生在真實產品中的真實故障,并介紹定位故障的調試工具和方法。案例中涉及的硬件包括經典的x86和新興的ARM;涉及的軟件平臺主要是GNU/Linux系統(tǒng);涉及的上層軟件包括Chrome瀏覽器、英偉達GPU驅動、微信、騰訊會議、阿里旺旺、銀行軟件等。書中涵蓋常見的各類軟件問題,包括應用程序崩潰、多線程死鎖、驅動程序故障、系統(tǒng)級掛死和崩潰等。書中設計了一些動手試驗,以供讀者上手小試牛刀。本書適合各個階段的軟件調試工程師參考閱讀。
一、以“偵探視角”寫調試,越讀越上癮。二、覆蓋面廣,形形色色的真實現場,一一呈現。三、不僅教調試之“術”,更傳授調試之“道”。
推薦語(按照姓氏拼音排序)
這本書難得地做到了兩件事:一是把調試、排障、逆向等“底層活兒”寫得既系統(tǒng)又生動;二是不僅講技術,更傳遞了問題導向的思維方式。它不是簡單的流水賬,而是作者多年與系統(tǒng)“死磕”的現場筆記,內容硬核,案例真實,讀完讓人更想深入底層世界。
段鋼 看雪學苑創(chuàng)始人
本書作者從實戰(zhàn)案例中提煉調試方法和技巧,如抽絲剝繭;系統(tǒng)性解決復雜軟件問題的工程能力,似庖丁解牛。本書是深入掌握軟件調試的良師益友。
李建忠 機器學習技術大會主席,
CSDN高級副總裁
本書暗含一條從調試入手“打怪升級”(格蠹致知)的修煉路徑,從利用調試手段解決日常困擾,到以調試利器刺探深層漏洞和底層細節(jié),再到御調試之劍在大規(guī)模系統(tǒng)軟件的世界中自如穿梭。
中文的“調試”一詞比英文的 Debug 含義更廣,不但包含了“捉蟲”的字面意思,還包含了調優(yōu)測試等設計活動,其實正切合調試活動的實質。調試早已與軟件設計和維護密不可分。細品書中的鮮活案例,體會其中的軟件作者(不乏來自“大”公司的“大”軟件)設計實現上的得失,在會心一笑、拍案叫絕之際,讀者的軟件設計功力和品味也得到滋養(yǎng)。
本書出版時,以 LLM 為代表的 AI 新浪潮正席卷軟件工業(yè),而 Kerninghan定律(書中的戴氏法則表達了類似的意思)仍適用:“人人都知道調試代碼的難度是編寫代碼的兩倍。所以如果你在寫代碼時用盡全力,那么你要如何調試它呢?”請讀者朋友思考:如何確保 AI 生成的代碼可調試?又如何調試“最聰明”的 AI 生成的代碼?
楊文波 資深嵌入式 C++ 程序員,《現代 C++ 白皮書》
《C++ Templates(第2版)》《C++ Core Guidelines 解析》等書譯者
格物致知,方可通達!案耋肌币嗍侨绱恕4藭F在“以戰(zhàn)說法”,將深奧的系統(tǒng)原理,融合于一個個真實的案例之中。它帶我們穿越崩潰、死鎖與掛起的迷霧,抽絲剝繭,尋蹤覓跡,不僅傳授調試之“術”,更啟迪我們洞察軟件運行之“道”。
朱少民 CCF杰出會員、《軟件工程3.0》作者
推薦序——Debug公案:痛并快樂著
Debug 是所有程序員痛苦與歡樂的來源,銀奎聚焦于軟件調試多年,也已出版過兩本軟件調試的暢銷書,但這本書太不同了。他之前寫的技術書,和大多數技術書籍一樣采取 循序漸進講技術點的方式,讀者閱讀和實踐的過程就類似于機器學習,以此建立起扎實系統(tǒng)和體系。而這本書采取“以戰(zhàn)說法”的方式,講述了63 個真實調試的故事,閱讀時就像閱讀系列偵探小說一樣引人入勝,而是否真正掌握了 debug的思路和屠龍技,可以在每個案件里打磨,不同段位的 “debugging 偵探”對每個案件的處理、分析還可以衍生出更多的知識點,太過癮了!2024 年優(yōu)質屆 CCF 程序員大會,銀奎演講時把我和他都感慨過的一句話放到大屏幕上:“計算機科學是一門極度工程化的 hands-on 學科,和其他學科太不同了。” 這也正是這本書最獨特的地方,全部都是“hands-on”的實例和“當時”在各種壓力條件下的解決之道——鐵打的bug,流水的調試,這本書的問題描述和分析,才是歷久彌新的精華所在。今天,AI 已經在編程中替代了很多人工工作,但是在各領風騷的 debugging 里,工程師的智慧閃爍其中,當然你會培養(yǎng)自己的AI華生或者黒斯廷斯。
說起程序調試,隨著計算機體系結構從單機、單進程迅速發(fā)展到多線程、大規(guī)模并行和分布式系統(tǒng),人類bug 偵探的頭腦極限,就面臨著新工具和新方法的瓶頸,譬如多線程程序的線程安全隱患,就無法使用單步和設置斷點的方式復現,必須采用統(tǒng)計方法的工具加以偵測;而面對大模型訓練和推理這樣大規(guī)模集群的并行應用,對錯誤的預測和定位是更大的挑戰(zhàn)。曾經有很長時間,debugging 和測試都不被重視,但每一個殫精竭慮從調試中走過來的工程師,才真正知曉系統(tǒng)調試的重要性。吳伯凡老師曾經說過一個洞見:“一個組織里最重要的工作,往往是不被看見的! 這里,就包含著含辛茹苦的調試工作。
讀這本書,我常想起 2001 年那個遙遠的芝加哥郊區(qū),同事們周末去市中心放松,我說:“你們走,我總算有一整天可以debug 了”,當然那不證明我有多精于調試,很有可能我只是個笨蛋偵探毛利小五郎,那時候我如果認識銀奎君,就會做好筆記,留下自己的偵探故事。
何萬青 清程極智合伙人 VP,前 Intel 首席工程師,
阿里云高性能計算負責人
前言
很多人都上過大學,但是很遺憾,很多人都沒有認真讀過《大學》這本書。
或許是因為值得學習的東西太多了,至少對于像我這樣的理科生來說,傳統(tǒng)文化中的很多瑰寶被忽視了。比如,我們上了很多作文課,卻沒有認真讀一讀《文心雕龍》;我們讀了很多的書,卻沒有讀一下短小精悍的經典之作《大學》。
30 多歲后,我開始廣泛閱讀非技術類書籍,隨著涉獵越來越廣,終于有機會接觸到那些本來被忽視的文化瑰寶。當我優(yōu)質次讀到《文心雕龍》的優(yōu)質句話“文之為德也大矣”時,真是感動不已,思接千載,仿佛看到了 1500 多年前的那位前輩……
優(yōu)質次讀《大學》時,我不禁拍案,原來那句“治國平天下”出自這本書。后來反復閱讀,慢慢體會到這本小書的精妙。
今年夏天,曾經與幾位“格友”到蘇州木瀆小聚,在靈巖山上分享閱讀《大學》的心得,很多陌生的游客圍過來傾聽。篇幅關系,此處只分享《大學》里的一個要點,即格物。
所謂《大學》,即大人的學問,中心思想是如何修身,也就是平常所說的人生是一場修煉。如何修身呢?簡單回答就是要格物。
《大學》原文如此:“古之欲明明德于天下者,先治其國;欲治其國者,先齊其家;欲齊其家者,先修其身;欲修其身者,先正其心;欲正其心者,先誠其意;欲誠其意者,先致其知,致知在格物。”
上文中的“格物”“致知”“正心”“誠意”“修身”“齊家”“治國”“平天下”被稱為大學的“八條目”,用來支持“明明德”“新民”“止于至善”這三個綱領。
在八條目中,“格物”位于末端,是基礎。
完整的《大學》分“經”和“傳”(讀 zhuàn)兩部分,“傳”是用來解釋“經”的。解釋“格物”的部分在流傳過程中散失了,宋代大儒朱熹做了補充,這就是著名的《格物補傳》,我很喜歡朱熹的文筆,其中的一段又可謂朱熹筆下的精華,必須引用一下:
“所謂致知在格物者,言欲致吾之知,在即物而窮其理也。蓋人心之靈莫不有知,而天下之物莫不有理,惟于理有未窮,故其知有不盡也。是以《大學》始教,必使學者即凡天下之物,莫不因其已知之理而益窮之,以求至乎其極。至于用力之久,而一旦豁然貫通焉,則眾物之表里精粗無不到,而吾心之全體大用無不明矣。此謂物格,此謂知之至也!
這段話對格物思想做了非常好的闡釋,但是沒有明確解釋“格物”二字的含義。讀八厚本《朱子語類》之第二冊,里面有更詳細的解釋,以師生問答的形式為主。
以我的淺薄理解,“格”的主要含義是探究和窮盡,可以做動詞,也可以做形容詞。所謂格物,就是探究事物,認識和深入理解,直到窮盡其內涵。
人生修煉有很多種方法,我喜歡格物思想的主要原因是它很客觀具體,不主觀虛無;很積極進取,不空洞無為。
世間萬物,錯綜復雜,千頭萬緒,雖然很多道理是相通的,即所謂“千頭萬緒,終歸一理”(朱熹語),但如何領悟到那一理呢?回答是格物,今日格一件,明日再格一件,
張銀奎,微軟最有價值技術(MVP),同濟大學電子與信息工程學院特邀講師,前INTEL亞太研發(fā)中心高級架構師,《軟件調試》、《格蠹匯編》、《軟件簡史》的作者,新版《十萬個為什么》電子分冊撰稿人之一,《程序員》雜志調試之劍專欄作者。
目錄
第 1 章 從掛死的 Chrome 中搶救未提交的圖文
第 2 章 long 究竟有多長,從皇帝的新衣到? SDK
第 3 章 在調試器下看微信是如何耗電的
第 4 章 大代碼時代下的一個大陷阱
第 5 章 Linux 系統(tǒng)登錄緩慢為哪般
第 6 章 抖音卡圖之謎
第 7 章 Wi-Fi 連網失敗為哪般
第 8 章 比內存被踩還難調試的問題
第 9 章 實戰(zhàn) FreeRTOS 的 UsageFault 異常
第 10 章 當挑剔的 Windows 遇到說半句話的鍵盤
第 11 章 閃存燒寫失敗和調試優(yōu)質心法
第 12 章 比聲音卡頓還難調試的問題
磨練第二
第 13 章 騰訊會議為何不閃即退
第 14 章 是誰不讓訪問用戶空間
第 15 章 微信掛死為哪般
第 16 章 這個銀行的安全軟件為何如此不安
第 17 章 誰動了我的硬盤
第 18 章 在調試里看 NV 驅動棧溢出導致的連環(huán)死鎖
第 19 章 0 號事件何處來
第 20 章 有一種錯叫持有鎖
第 21 章 粘在斷點為哪般
第 22 章 炸彈指令何處來
第 23 章 CPU 跑飛為哪般
第 24 章 在調試器里看 QQLive 捉迷藏
發(fā)微第三
第 25 章 雕刻在 Linux 內核中的林納斯故事
第 26 章 GDB 埋下的斷點指令,你可曾親見
第 27 章 Linux 內核優(yōu)質霸
第 28 章 M 核的優(yōu)質條指令
第 29 章 品味 CPU 的元始狀態(tài)
第 30 章 從貓蛇之戰(zhàn)看內核戲 CPU
第 31 章 投機之殤——解說史上最大 CPU 漏洞
第 32 章 SMM 和如來佛手掌心
第 33 章 觀察神秘的 RQ
第 34 章 自卷如何救,互斥量重入死鎖例談
第 35 章 奇怪的未定義引用
第 36 章 這個修改居然是二掌門的主意
第 37 章 是誰惹惱命令行
器具第四
第 38 章 三線擼豹,神乎其技——ARM 硬件調試器的神功
第 39 章 看見我們所看不見的
第 40 章 一顆電阻的旅行
第 41 章 ARM PTM、ETM 和以物為師
第 42 章 有一種程序員文化叫串口
第 43 章 新串口通道打通紀實
第 44 章 美哉,符號服務器
第 45 章 有一個驅動叫劉姥姥
第 46 章 GDB 調試 GDB 一例
第 47 章 編譯器,你在說啥
第 48 章 地址歧義和 GCC 的不可能邏輯
第 49 章 當 GDB 遇到 STL
第 50 章 是誰調用了 init 函數
日新第五
第 51 章 納秒時代
第 52 章 戒慎乎不睹,大模型體驗記
第 53 章 在調試器里看 GPU 的長指令
第 54 章 AMD GPU 的斷點指令
第 55 章 ARM64 上的動態(tài)鏈接
第 56 章 穿越兩大空間的調用棧
第 57 章 在 GDB 下學習 box64
第 58 章 在 RK3588 上體驗 UEFI
第 59 章 追逐光的步伐
第 60 章 玄而又玄——我親歷的三大總線
第 61 章 安卓調試新紀元
第 62 章 獨上高樓,學習 Linux 的 6 種境界
第 63 章 如何格軟件
附錄 A ARM 的多重含義
附錄 B 廬山研習班上介紹的 25 個 Linux 工具
附錄 C 故事中的那些計算機