編譯性的語言,編譯過程中的錯誤只是簡單的語法錯誤排除,對于C語言的卡位顯得更加的疏松,很多即使有很多警告一樣能夠編譯通過,相對來講c++編譯的語法顯得更加嚴密但也阻止不了在執行的時候出問題,有些錯誤是壓根在編譯的時候發現不了的。從事嵌入式開發十幾年用的最多的編程語言屬于C/C++,如何避免出現執行錯誤,不僅僅是表面上的語法細節問題,更加深層次的是代碼邏輯問題。
現在根據嵌入式的一些開發經驗總結下編譯么有錯誤,但是執行起來卻導致系統崩潰的幾點原因
這種問題在編譯的時候根本是無法追查出來的,做過一個項目,有個同事增加了一個新的功能,自從加上這個新功能之后,運行48個小時基本上就會死機,發現到這個時間點之后內存就會消耗光了,因為早期的嵌入式設備的內存非常有限,非常容易被耗光。最后發現是C語言寫的一行代碼不停的申請內存,由于每次申請的內存字節數不是很多,但時間長了內存也會慢慢耗光,最后還是通過鉤子函數追蹤找到問題所在。
在平常的開發過程中大塊的內存泄漏問題一般比較容易查找,小塊的內存泄漏查找的難度要多上好幾倍,解決這種問題就是抓場景,特別是軟件場景解決問題就是找到復現的關鍵點,一旦問題能夠復現出來,基本上意味著問題已經解決了一半。
語法細節上的錯誤,在編譯的時候是無法直接看到的,舉個簡單的例子,直接分子為零,只有在運行的時候能發現,這一切就歸屬于語法錯誤,如果基本功扎實出現這種問題的概率會少很多,所以很多程序員容易忽略基本功的學習,覺得反正能夠寫代碼,大不了直接在網上找代碼,還不是一樣能夠完成任務。
這點C++編譯的時候卡位會更加嚴格,初學C++的都會覺得比C語言編譯起來費勁多了,這是C++吸取了C語言里面語法隨意簡單的一面,爭取把問題發現在前面,所以C++運行的時候一些奇形怪狀的錯誤相對少一些,C語言語法比較靈活,往往在追查問題的時候不太容易。
一般經驗豐富的程序員對這方面關注會多一點,有些程序運行一段時間就會變得非常緩慢,甚至卡死,這些原因就是深層次的代碼邏輯以及架構的問題了,但再高深的架構也離不開基本的語法,編程語言基本功越扎實,技術自信度也就越強,也就越容易出創造性東西。
做一名程序員早晚都得在這個層面去思考,讓自己逐漸在項目中成長,從項目中找到差距,是編程基本功問題還是編程思想出了問題,所以語法上的錯誤僅僅是表面的現象,出現過的錯誤怎么能不再下次出現了,審視每個在項目中遇到的問題。
一個程序員的成長過程就是先關注基本的語法錯誤,到提煉項目中的編程經驗,到提升框架思想的過程,不要忽略編程過程中發現的每一個細節,每一次錯誤都是自己成長的機會。
希望能夠幫到你。