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