老司机找BUG指南,赶紧拿走。。
一.碼畜:靠編譯器幫自己查語(yǔ)法錯(cuò)誤
消滅筆誤:編寫適合程序員的鍵盤練習(xí)
if (常量==變量或表達(dá)式)
使用goto接力超長(zhǎng)的if,switch
連續(xù)的if還是if elseif
多個(gè)條件的組合:精心的排版
多重括號(hào)的匹配
條件編譯
各種const:不要糾結(jié)各種常量了,這個(gè)世界上唯一不變的就是變化。用APIWriteProcessMemory還能修改正運(yùn)行的其它進(jìn)程的內(nèi)存里面的所謂常量呢!
查看宏展開后的.i文件:VC編譯選項(xiàng)加/EP /P(項(xiàng)目、屬性、配置屬性、C/C++、預(yù)處理器、預(yù)處理到文件:是,預(yù)處理取消顯示行號(hào):是),重新編譯,查看宏展開后對(duì)應(yīng)的.i文件。gcc加-E
偶遇到莫名其妙的編譯錯(cuò)誤都是用“每次用/*...*/或#if 0...#endif注釋掉不同部分再重新編譯,直到定位到具體語(yǔ)法出錯(cuò)的位置。”的方法解決的。
附加包含路徑、附加庫(kù)路徑、附加依賴庫(kù)的設(shè)置。
二.碼農(nóng):靠調(diào)試器幫自己查邏輯錯(cuò)誤
for/while語(yǔ)句后多余的分號(hào)
while/do while語(yǔ)句在語(yǔ)義上的歧義
條件斷點(diǎn)
消息斷點(diǎn)
數(shù)據(jù)斷點(diǎn)
__asm int3或DebugBreak()斷點(diǎn)
在內(nèi)存窗口中觀察數(shù)據(jù)的原始字節(jié)形態(tài)
Call Stack:崩潰的時(shí)候在彈出的對(duì)話框按相應(yīng)按鈕進(jìn)入調(diào)試,按Alt+7鍵查看Call Stack即“調(diào)用堆棧”里面從上到下列出的對(duì)應(yīng)從里層到外層的函數(shù)調(diào)用歷史。雙擊某一行可將光標(biāo)定位到此次調(diào)用的源代碼或匯編指令處,看不懂時(shí)雙擊下一行,直到能看懂為止。
“給定一個(gè)小點(diǎn)的輸入,完整單步跟蹤(同時(shí)按Alt+7鍵查看Call Stack里面從上到下列出的對(duì)應(yīng)從里層到外層的函數(shù)調(diào)用歷史)一遍。”是理解遞歸函數(shù)工作原理的不二法門!
遞歸函數(shù)關(guān)注以下幾個(gè)因素
·退出條件
·參數(shù)有哪些
·返回值是什么
·局部變量有哪些
·全局變量有哪些
·何時(shí)輸出
·會(huì)不會(huì)導(dǎo)致堆棧溢出
語(yǔ)法糖越甜,編譯調(diào)試查錯(cuò)越苦!
C++的隱藏調(diào)用:單步類的實(shí)例“構(gòu)造”或“復(fù)制”或“作為函數(shù)參數(shù)”或“作為函數(shù)返回值返回”或“參加各種運(yùn)算”或“退出作用域”的語(yǔ)句對(duì)應(yīng)的匯編代碼幾步后,就會(huì)來(lái)到該類的“構(gòu)造函數(shù)”或“復(fù)制構(gòu)造函數(shù)”或“運(yùn)算符重載”或“析構(gòu)函數(shù)”對(duì)應(yīng)的C/C++源代碼處。
任務(wù)管理器、VMMap、Process Monitor、Process Explorer、GDI泄露檢測(cè)工具、……
三.碼人:靠寫日志幫自己查運(yùn)營(yíng)錯(cuò)誤
CrashDump或Core的無(wú)力。
PDB的無(wú)力。
線上Debug的無(wú)力。
觀察復(fù)雜數(shù)據(jù)的無(wú)力。
多線程調(diào)試的無(wú)力。
調(diào)試時(shí)序高度依賴代碼的無(wú)力。
調(diào)試萬(wàn)年一遇非法數(shù)據(jù)的無(wú)力。
有時(shí)不將“調(diào)用函數(shù)名字+各參數(shù)值,進(jìn)入函數(shù)后各參數(shù)值,中間變量值,退出函數(shù)前準(zhǔn)備返回的值,返回函數(shù)到調(diào)用處后函數(shù)名字+各參數(shù)值+返回值”這些信息寫日志到文件中是無(wú)論如何也發(fā)現(xiàn)不了問(wèn)題在哪里的,包括捕獲各種異常、寫日志到屏幕、單步或設(shè)斷點(diǎn)或生成core或dmp文件、……這些方法都不行!
四.碼神:靠冥想和頓悟幫自己查不可再現(xiàn)錯(cuò)誤
假死的各種原因:
·控制循環(huán)的變量的取值范圍有符號(hào)/無(wú)符號(hào),==/<=
·控制循環(huán)的變量沒變
·控制循環(huán)的變量被外部程序修改
·各種資源泄露
·死鎖
·網(wǎng)速變慢或網(wǎng)絡(luò)資源耗盡或網(wǎng)絡(luò)時(shí)通時(shí)斷
·權(quán)限、UAC、殺毒軟件實(shí)時(shí)防護(hù)
·操作系統(tǒng)或軟件自動(dòng)升級(jí)
·以為系統(tǒng)時(shí)間不可逆
·以為系統(tǒng)時(shí)間相關(guān)變量不會(huì)溢出(GetTickCount()約49.7天就歸0了!)
不要企圖優(yōu)雅的結(jié)束(因?yàn)檫@是不可能辦到的)
而要在爛的不能再爛的攤子上也能重整河山!
完
關(guān)注它,
你就可以得到
很多你想要的C/C++
開發(fā)工具及學(xué)習(xí)視頻資料
總結(jié)
以上是生活随笔為你收集整理的老司机找BUG指南,赶紧拿走。。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 洛基的权杖是什么宝石 洛基的权杖是何宝石
- 下一篇: 支付宝地址在哪里设置