老司機找bug的十年心路歷程

2021-08-27 21:01:56 字數 2063 閱讀 6433

一.碼畜:靠編譯器幫自己查語法錯誤

消滅筆誤:編寫適合程式設計師的鍵盤練習

if (常量==變數或表示式)

使用goto接力超長的if,switch

連續的if還是if elseif

多個條件的組合:精心的排版

多重括號的匹配

條件編譯

各種const:不要糾結各種常量了,這個世界上唯一不變的就是變化。用apiwriteprocessmemory還能修改正執行的其它程序的記憶體裡面的所謂常量呢!

檢視巨集展開後的.i檔案:vc編譯選項加/ep /p(專案、屬性、配置屬性、c/c++、預處理器、預處理到檔案:是,預處理取消顯示行號:是),重新編譯,檢視巨集展開後對應的.i檔案。gcc加-e

偶遇到莫名其妙的編譯錯誤都是用「每次用/*...*/或#if 0...#endif注釋掉不同部分再重新編譯,直到定位到具體語法出錯的位置。」的方法解決的。

附加包含路徑、附加庫路徑、附加依賴庫的設定。

二.碼農:靠偵錯程式幫自己查邏輯錯誤

for/while語句後多餘的分號

while/do while語句在語義上的歧義

條件斷點

訊息斷點

資料斷點

__asm int3或debugbreak()斷點

在記憶體視窗中觀察資料的原始位元組形態

call stack:崩潰的時候在彈出的對話方塊按相應按鈕進入除錯,按alt+7鍵檢視call stack即「呼叫堆疊」裡面從上到下列出的對應從裡層到外層的函式呼叫歷史。雙擊某一行可將游標定位到此次呼叫的源**或彙編指令處,看不懂時雙擊下一行,直到能看懂為止。

「給定乙個小點的輸入,完整單步跟蹤(同時按alt+7鍵檢視call stack裡面從上到下列出的對應從裡層到外層的函式呼叫歷史)一遍。」是理解遞迴函式工作原理的不二法門!

遞迴函式關注以下幾個因素

·退出條件

·引數有哪些

·返回值是什麼

·區域性變數有哪些

·全域性變數有哪些

·何時輸出

·會不會導致堆疊溢位

語法糖越甜,編譯除錯查錯越苦!

c++的隱藏呼叫:單步類的例項「構造」或「複製」或「作為函式引數」或「作為函式返回值返回」或「參加各種運算」或「退出作用域」的語句對應的彙編**幾步後,就會來到該類的「建構函式」或「複製建構函式」或「運算子過載」或「析構函式」對應的c/c++源**處。

任務管理器、vmmap、process monitor、process explorer、gdi洩露檢測工具、……

三.碼人:靠寫日誌幫自己查運營錯誤

crashdump或core的無力。

pdb的無力。

線上debug的無力。

觀察複雜資料的無力。

多執行緒除錯的無力。

除錯時序高度依賴**的無力。

除錯萬年一遇非法資料的無力。

有時不將「呼叫函式名字+各引數值,進入函式後各引數值,中間變數值,退出函式前準備返回的值,返回函式到呼叫處後函式名字+各引數值+返回值」這些資訊寫日誌到檔案中是無論如何也發現不了問題在**的,包括捕獲各種異常、寫日誌到螢幕、單步或設斷點或生成core或dmp檔案、……這些方法都不行!

四.碼神:靠冥想和頓悟幫自己查不可再現錯誤

假死的各種原因:

·控制迴圈的變數的取值範圍有符號/無符號,==/<=

·控制迴圈的變數沒變

·控制迴圈的變數被外部程式修改

·各種資源洩露

·死鎖·網速變慢或網路資源耗盡或網路時通時斷

·許可權、uac、防毒軟體實時防護

·作業系統或軟體自動公升級

·以為系統時間不可逆

·以為系統時間相關變數不會溢位(gettickcount()約49.7天就歸0了!)

不要企圖優雅的結束(因為這是不可能辦到的)

而要在爛的不能再爛的攤子上也能重整河山!

python正確的學習路線,你一定不知道的薪資翻倍秘訣

如何從8k提至20k月薪,你要掌握學習那些技能

老司機找bug的十年心路歷程

一.碼畜 靠編譯器幫自己查語法錯誤 消滅筆誤 編寫適合程式設計師的鍵盤練習 if 常量 變數或表示式 使用goto接力超長的if,switch 連續的if還是if elseif 多個條件的組合 精心的排版 多重括號的匹配 條件編譯 各種const 不要糾結各種常量了,這個世界上唯一不變的就是變化。用...

老司機找bug的十年心路歷程

一.碼畜 靠編譯器幫自己查語法錯誤 消滅筆誤 編寫適合程式設計師的鍵盤練習 if 常量 變數或表示式 使用goto接力超長的if,switch 連續的if還是if elseif 多個條件的組合 精心的排版 多重括號的匹配 條件編譯 各種const 不要糾結各種常量了,這個世界上唯一不變的就是變化。用...

老司機找bug的十年心路歷程

一.碼畜 靠編譯器幫自己查語法錯誤 消滅筆誤 編寫適合程式設計師的鍵盤練習 if 常量 變數或表示式 使用goto接力超長的if,switch 連續的if還是if elseif 多個條件的組合 精心的排版 多重括號的匹配 條件編譯 各種const 不要糾結各種常量了,這個世界上唯一不變的就是變化。用...