調試程序有哪些技巧?
01-04
大家交流一下吧
善用二分法。
寫過一篇:http://techsingular.net/?p=1062
其中有些技巧發現很少有人用。比如死鎖用 pause 就可以瞬間定位。Watch point 也往往和 breakpoint 作用相當。
調試程序是一門學科,有專門的硬體與軟體來幫助軟體開發者處理各種異想不到的問題。調試不僅限於軟體,同樣適用於硬體,比如cpu。調試做為軟體開發不可獲缺的一部分,每個開發人員都應該學會如何調試程序,包括彙編,高級語言,腳本語言,以及相應的硬體平台與操作系統。
你問的問題沒有具體方面,這裡也不便針對回答。
unix系與windows系目前在調試工具上有較大區別,微軟出品的windbg在相應平台的使用率很高。而DBG在mac/linux平台佔有絕對優勢,所以你想了解哪個平台還需針對學習相關內容。調試需要很多開發經驗與實踐經驗,要在工作中不斷學習。只要不是access violation和racing condition這種幾乎只有C++才會經常遇到的問題以外,其它問題都可以通過在單元測試裡面「刪除一半代碼」來調試。什麼,沒有單元測試?那隻好苦逼了。
我的程序在我做調試的時候都會出現大量的輸出參數代碼和輸出標記代碼輸出參數代碼不用多說輸出位置代碼一般都是前一個後一個,然後一點點的縮小問題範圍……雖然我知道BREAK POINT這東西,以前也試著去用過,不過這年頭從DEV-CPP到VC到ECLIPSE到XCODE,幾乎是一個IDE一種BREAK POINT設置方式……變數追蹤也是的……真心傷不起……我還是老老實實的回歸原始了……
寫了一篇關於調試的文章,比較長,就只把地址貼出來:
codedump
在我看來,調試不僅涉及到方法,還牽扯到態度,而態度,又決定了你以後的成長。在linux 上調試工具:strace 、 ltrace、 gdb、 valgrind 和網路有關的工具netstat tcpdump等
基本上,我用strace 、netstat 、tcpdump 三個工具+printf 就能搞定,valgrind 和GDB偶爾用用
windows上的推薦 purify 、straceNT、filemon以上講的只是工具,會給你帶來不小的幫助。但最重要的還是你自己的分析能力和你對信息的敏感度,這需要長期的鍛煉,沒有特別的捷徑.可以問問自己:哪幾個點的變化或無變化對你的問題的判斷有幫助1 根據錯誤關鍵字查找可能出現處2 前後斷點,log基本就這樣,
第一步:重現問題。這一步非常重要,如果可以,儘可能能夠通過一定的步驟可以穩定的把問題重現出來。即使問題很難重現,能夠找到偶爾重現的規律和概率對於解決問題也是很有幫助的。
第二步:縮小範圍。這裡會有一些技巧和經驗,比如使用二分法去縮小出問題代碼的數目。一般的問題都是修改引起的,把有問題的代碼限定為最近的修改,一下子就把範圍縮小了很多。單元測試的一個好處就是可以把每次可能出問題的範圍做了一個控制,這樣解決起來就容易很多。
第三步: 尋找原因。對於一般的問題,經過第一步第二部,第三步也就是看一下變數,就可以得出類似 「多寫了一個分號「這樣的原因。但是對於複雜的問題(比如你好死不死踩到了編譯器的雷),這個時候,可能需要先大膽作出一些假設,然後放狗搜索,必要的時候做實驗驗證,才能得到令人信服的原因。
綜上,我們首先要弄清楚問題是什麼(第一步),控制好問題的邊界(第二步),然後才是找到問題的原因(第三步)。推薦閱讀:
※未來會不會出現這樣的編程語言?
※是否數學不好就學不好編程?
※程序員如何掌握編程思想?
※像我這種情況,該如何繼續學習遊戲中實時渲染這方面知識?
※MacBook Pro適合深度學習嗎?