衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

代碼調(diào)試一些常見的錯誤

C語言編程學(xué)習(xí)基地 ? 來源:C語言編程學(xué)習(xí)基地 ? 作者:C語言編程學(xué)習(xí)基地 ? 2022-08-27 11:56 ? 次閱讀

無論你是初學(xué)者,還是軟件開發(fā)領(lǐng)域的專家,都無法避免代碼中出現(xiàn)錯誤。

我們所有人開發(fā)的代碼中都有錯誤,因?yàn)椋瑳]有人能夠徹底的了解編碼過程中發(fā)生的一切。

因此,在項(xiàng)目開發(fā)過程中需要耗費(fèi)時間,在Debug過程中同樣需要耗費(fèi)大量的精力。

e2208f3e-2516-11ed-ba43-dac502259ad0.png

我們只能研究我們自己,研究我們的工具,研究我們的bug,找到解決方案,幫助我們更高效的減少開發(fā)過程中出現(xiàn)的bug。

如何處理bug,我認(rèn)為主要可以分為3個階段:

一、預(yù)調(diào)試:在開發(fā)過程中盡量避免bug出現(xiàn)

二、調(diào)試:發(fā)現(xiàn)bug、識別bug、修復(fù)bug、移除bug

三、調(diào)試后:預(yù)估未知、未出現(xiàn)的bug

下面,我們來詳細(xì)介紹每個階段。

預(yù)調(diào)試

就像計算機(jī)科學(xué)家Edsger W. Dijkstra所說的那樣:

"如果說調(diào)試是消除錯誤的過程,那么編程一定是引入錯誤的過程。"

如果我們通過編程給程序引入bug,那就意味著我們需要引導(dǎo)自己減少引入bug的數(shù)量。我把這個引導(dǎo)自己的過程稱為 "預(yù)調(diào)試"(Prebugging)。

我在Google上搜索 "Debug"的定義,從牛津詞典上看到的定義引起了我的思考。

“Debug從計算機(jī)硬件或軟件中識別和消除錯誤的過程。”

這個定義引起了我的思考,因?yàn)槲蚁嘈藕芏嘬浖_發(fā)人員都是主動進(jìn)行調(diào)試的。他們改進(jìn)他們的工具和自己,以減少他們產(chǎn)生的bug數(shù)量。

雖然這個定義對于調(diào)試來說是可以接受的,但是它淡化了軟件開發(fā)人員為減少bug產(chǎn)生而做的其他每一件事。所以我們現(xiàn)在就來看看這些事情。

了解你經(jīng)常使用的工具

了解你經(jīng)常使用的所有工具是很重要的,因?yàn)檫@有助于你減少編碼時產(chǎn)生的bug。

沒有辦法完全避免bug的產(chǎn)生,但是如果你對你所使用的工具的基礎(chǔ)知識非常健全的話,你可以避免產(chǎn)生一些bug。

例如,很多JavaScript用戶記不住什么是返回。而有些人記不住和數(shù)組方法的區(qū)別。

如果你不是JavaScript用戶,只需從你使用的語言中挑選一個內(nèi)置的方法或函數(shù),然后問自己:

這個方法需要什么樣的參數(shù)?這個方法會返回什么?如果提供了一個無效的參數(shù)會發(fā)生什么?

經(jīng)常問自己上述問題,可以讓你學(xué)習(xí)到很多知識。

這就是如何讓自己保持對經(jīng)常使用的工具的基礎(chǔ)知識的更新,尤其是在你沒有太多時間主動閱讀的情況下。

編碼前的計劃

編程似乎是一個反復(fù)嘗試的工作,你需要不斷嘗試,直到正確為止。

許多初級軟件開發(fā)人員并沒有真正理解他們正在開發(fā)的程序,其中一些人在上網(wǎng)搜索報錯信息之前,其實(shí)并沒有嘗試去理解錯誤信息。

現(xiàn)在,每個人似乎都覺得編程始終與“代碼,代碼,代碼,搜索,調(diào)試”有關(guān)。

但是有必要真正了解你在做什么,以便你可以快速列出:

我們期望將什么作為輸入以及這些輸入的結(jié)構(gòu)和特征

我們期望如何處理這些輸入

我們最終期望返回的是什么

如果沒有給出預(yù)期的輸入,需要做些什么

簡而言之,對函數(shù)或程序的輸入,過程和輸出進(jìn)行規(guī)劃不僅可以幫助你減少錯誤,還可以幫助你編寫有效的測試用例。

e277e59a-2516-11ed-ba43-dac502259ad0.png

熟悉常見的錯誤信息

如果你已經(jīng)熟悉了一個錯誤或bug,往往很容易修復(fù)。

所以,花時間研究一些常見的錯誤,并學(xué)習(xí)如何去修復(fù)這些錯誤是很重要的。現(xiàn)在我們就來談?wù)勔恍┏R姷腻e誤。

語法錯誤

每一種編程語言都有自己的規(guī)則,開發(fā)者要對違反這些規(guī)則的行為負(fù)責(zé)。

編程語言對規(guī)則的要求很嚴(yán)格,只要違反了這些規(guī)則,它們就會拋出錯誤。

例如,想象一下,你省略了一個函數(shù)或方法的括號:function{}

會拋出一個錯誤。

熟悉語法錯誤的錯誤信息,以及如何修復(fù)它,會讓你在調(diào)試時更有優(yōu)勢。

我個人注意到,大多數(shù)語法錯誤總會提到一些關(guān)鍵詞,幫助你找出代碼中出錯的部分。

e28c1f42-2516-11ed-ba43-dac502259ad0.png

返回的 "undefined"告訴我們,我們要訪問的對象或?qū)傩允遣豢捎玫摹H绻覀兠翡J地注意錯誤信息,就能找出問題所在。

你寫的代碼越多,你就越能夠避免語法錯誤。你也可以簡單地使用代碼編輯器、靜態(tài)檢查工具,能夠高亮突出語法錯誤。使用這些工具可以給你帶來很大的幫助。

邏輯/語義錯誤

邏輯錯誤是非常棘手的問題,因?yàn)樗鼈兛瓷饺ナ菦]有錯誤的--但你仍然沒有得到預(yù)期的結(jié)果。

例如,確認(rèn)這種錯誤的一個簡單方法是在瀏覽器的控制臺中檢查下面的代碼。

prompt("enter number") +3;

你可能希望輸出一個數(shù)字,但它會返回一個字符串。

簡而言之,你將不會得到預(yù)期的結(jié)果。

在編碼前進(jìn)行規(guī)劃,了解你所使用的編程語言的基礎(chǔ)知識,可以幫助你處理邏輯錯誤--前提是你要理解給你的程序要求。

編譯錯誤

你的程序可能無法編譯,因?yàn)槟憧赡苓`反了編譯器希望你遵守的一些規(guī)則。

所以,你正在編寫的程序可能無法編譯。

例如,寫一個字符串時沒有使用通常的引號,會導(dǎo)致編譯錯誤,因?yàn)樽址仨毷褂靡枴K裕a將無法編譯。

const name= Ayobami

這與語法錯誤類似,你寫的代碼越多,你就越能更好地處理編譯錯誤。

你可以通過經(jīng)常編譯或測試你的代碼來提高工作效率,減少這些錯誤。

資源錯誤

有時,你的程序可能會超過其內(nèi)存限制或用盡可用資源。

這可能會導(dǎo)致你的應(yīng)用程序停止服務(wù)或出現(xiàn)故障。

下面的代碼是一個導(dǎo)致資源錯誤的代碼的實(shí)際例子。

e29c2de2-2516-11ed-ba43-dac502259ad0.png

由于堆棧空間(即瀏覽器分配給函數(shù)調(diào)用鏈的內(nèi)存)被用完,函數(shù)崩潰或使瀏覽器變慢。

在這種情況下,該錯誤是資源錯誤,因?yàn)樗怯捎谟猛攴峙涞膬?nèi)存(資源)而發(fā)生的。

接口錯誤

有時候,我們設(shè)計的程序API是按照一定的方式來使用的,但是用戶使用程序的方式不同,就會造成錯誤。

這種錯誤被稱為接口錯誤。

例如,假設(shè)方法期望的是一個字符串,但我們卻用一個數(shù)字來代替調(diào)用它。如果程序的開發(fā)者沒有考慮到這種情況,就會導(dǎo)致錯誤。

軟件中的大多數(shù)事物都遵循標(biāo)準(zhǔn)。如果你所定義的標(biāo)準(zhǔn)沒有被遵循,你需要為你的用戶提供錯誤信息或指南,以幫助他們弄清楚他們正在錯誤地使用應(yīng)用程序。

在這種情況下,記錄你的API可以提供很多幫助。

確保你的設(shè)置與工具相互匹配

有一個適合你的工具的設(shè)置是很重要的。

有時,你的操作系統(tǒng)可能與你的應(yīng)用程序不兼容--也許是因?yàn)樗枰粋€較新版本的操作系統(tǒng),或者它需要某個軟件。

例如,如果電腦上缺少一些微軟的VC運(yùn)行時,WampServer可能無法在Windows操作系統(tǒng)上正常運(yùn)行。

類似的事情也可能發(fā)生在Linux和macOS上。

你只需要確定你的設(shè)置是適合你的開發(fā)工作的。

對你的程序的功能要有確定性

"在數(shù)學(xué)、計算機(jī)科學(xué)和物理學(xué)中,確定性系統(tǒng)是指在系統(tǒng)未來狀態(tài)的發(fā)展中不涉及隨機(jī)性的系統(tǒng)。因此,一個確定性模型將始終從一個給定的起始條件或初始狀態(tài)產(chǎn)生相同的輸出"。

那么,問題是,我們?nèi)绾巫鲆粋€確定性的程序?

你必須確定你的程序中可以接受的數(shù)據(jù)類型,拒絕任何不符合的數(shù)據(jù)。

簡而言之,你需要接受預(yù)期的數(shù)據(jù),拒絕不符合預(yù)期的數(shù)據(jù),或者將預(yù)期的數(shù)據(jù)通知用戶。

不懂就不要用

減少bug產(chǎn)生的最好方法之一是只使用你了解的方法、方法和類。

如果你必須使用任何你不理解的方法或樣式,在做之前先研究一下,確定對它有深入的理解。

每當(dāng)你利用你不了解的東西時,很容易給你的應(yīng)用程序引入不必要的bug。

學(xué)會準(zhǔn)確打字

打字準(zhǔn)確被低估了,因?yàn)榫幊谈嗟氖撬伎级皇谴蜃帧5诖蜃謺r準(zhǔn)確無誤可能會幫助你減少一些語法錯誤、類型錯誤或錯別字。

許多編程錯誤都是由簡單的打字錯誤引起的。

準(zhǔn)確打字的能力能夠減少開發(fā)過程中的bug。

邊調(diào)試邊觀察其他開發(fā)者

另一個有趣的提高調(diào)試技能的方法是,當(dāng)其他開發(fā)者進(jìn)行調(diào)試時,觀察他們,這有助于看到不同的調(diào)試方法。

總會有一些我們不知道或不曾使用的工具或方法來進(jìn)行調(diào)試,觀察別人的調(diào)試讓我們有機(jī)會發(fā)現(xiàn)那些我們可能不知道的工具或方法。

或者即使你知道那些不同的方法,你也可能不知道為什么或如何使用它們。

觀察別人可以影響我們重新審視這些方法和工具,最終可能提高我們的調(diào)試技能。

調(diào)試

調(diào)試是編程的核心,因?yàn)樗诰幋a時占用的時間最多。

調(diào)試主要涉及三個階段:

(1)發(fā)現(xiàn)錯誤

(2)分析并理解錯誤發(fā)生的原因

(3)修復(fù)或移除bug

發(fā)現(xiàn)錯誤

發(fā)現(xiàn)bug首先需要了解你看到的錯誤信息。

毋庸置疑,錯誤信息就是一個bug的指南。

如果你理解了錯誤信息,你就可以精確地追蹤到錯誤的位置。

但是有些錯誤可能會很繁瑣,因?yàn)樗鼈兛赡軟]有明確的錯誤信息和未知。

就像前面所說,邏輯/語義錯誤只是得不到我們想要的結(jié)果。

為了找到bug,你需要:

明確你的期望;檢查你得到的結(jié)果;比較你的期望值和實(shí)際結(jié)果,看看差異;你可以使用調(diào)試器或其他有用的工具來快速找到這些錯誤;然后,你可以根據(jù)你的假設(shè)檢查代碼的不同部分,并執(zhí)行試錯來找到錯誤。

分析并理解錯誤發(fā)生的原因

找到一個bug之后,你需要弄清楚為什么代碼會有這樣的錯誤。

這樣做可以幫助你建立一個高效的系統(tǒng)。

相反,許多開發(fā)人員只會在谷歌上搜索,并直接從StackOverflow得到的答案。

這在某些情況下是沒有問題的,但最好是了解bug的原因和為什么解決方案有效。

理解bug的原因是修復(fù)bug或刪除bug道路上的重要一步。

修復(fù)或移除bug

在找到并了解了bug的原因后,我們就要修復(fù)這個bug。

有的時候,當(dāng)你了解了bug是什么之后,你就會毫無壓力的找到解決方案。

但是,有的時候,我們的理解無論怎么努力,都找不到任何解決方案。

與其浪費(fèi)時間,不如在谷歌上搜索錯誤信息或任何你覺得合適的信息。

你也可以問另一個人,因?yàn)槠渌送鶗胁煌目捶āK麄兪侵辛⒌模@種中立性確實(shí)有助于修復(fù)一些bug。

所以,谷歌一下吧!

修復(fù)一個令人困擾的bug總是會帶來巨大的興奮。

但不要太過沉浸在興奮中,因?yàn)樾迯?fù)一個bug可能會引起另一個bug。

所以,首先要確保你沒有給程序引入另一個問題。

這就是為什么自動化測試很重要。

調(diào)試后

調(diào)試后需要在你已經(jīng)寫好的程序中預(yù)測有可能出現(xiàn)的bug。

它指的是你可能使用的所有機(jī)制,以確保未知的bug在危害系統(tǒng)或公司之前能夠很容易被追蹤或管理。

現(xiàn)在的問題是你如何做到這一點(diǎn)?嗯,用錯誤跟蹤系統(tǒng)。

你應(yīng)該在生產(chǎn)中擁有一個錯誤跟蹤系統(tǒng),這樣你就可以很容易地發(fā)現(xiàn)錯誤,因?yàn)樗鼈冊谀愕膽?yīng)用程序推送到生產(chǎn)后出現(xiàn)。

有很多錯誤跟蹤器,它們只需要上網(wǎng)搜索一下就可以了。不過這里有幾個大家可以看看。

www.sentry.io

www.honeybadger.io

www.pypi.org

www.airbrake.io

www.logrocket.com

有這么多的錯誤跟蹤器,你只需要選擇一個最適合你的即可。

e34c6ad6-2516-11ed-ba43-dac502259ad0.png

結(jié)語

調(diào)試是所有軟件開發(fā)人員必須培養(yǎng)的一項(xiàng)重要技能。

它是編碼的核心,如果你做得好,它可以讓你成為一個更好的開發(fā)者。

要想成為優(yōu)秀的調(diào)試高手,你必須盡可能多地學(xué)習(xí)各種調(diào)試方法,很多方法我在本文中已經(jīng)討論過了。

現(xiàn)在是時候成為一名優(yōu)秀的軟件開發(fā)人員了,而調(diào)試可以在這條路上幫助你。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 軟件開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    624

    瀏覽量

    27443
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3795

    瀏覽量

    81405
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4346

    瀏覽量

    62968
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4825

    瀏覽量

    69040

原文標(biāo)題:【代碼調(diào)試】有哪些新手程序員不知道的小技巧?

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    keil mdk的一些常見錯誤解析

    近期遇到的keil mdk的一些常見錯誤 解析 2,USER\main.c(39):warning:#223-D: function "TP_GetAdXY"
    發(fā)表于 07-06 07:19

    介紹一些常見的匯編語句

    即使使用C/C++或者其他高級語言編程,最后也會被編譯工具轉(zhuǎn)換為匯編代碼,并最終作為機(jī)器碼存儲在內(nèi)存、硬盤或者其他存儲器上。在調(diào)試程序時,經(jīng)常需要閱讀它的匯編代碼.這里介紹一些自己
    發(fā)表于 12-20 06:05

    分享一些以太網(wǎng)常用的調(diào)試方法

    對于單phy的平臺以太網(wǎng)技術(shù)已經(jīng)很成熟,這里提供一些以太網(wǎng)常用的調(diào)試方法。幫助客戶快速定位常見問題。 以太網(wǎng)常用的命令有哪些呢?如何對其進(jìn)行調(diào)試呢?
    發(fā)表于 12-29 07:32

    DSP的一些代碼資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是DSP的一些代碼資料免費(fèi)下載。
    發(fā)表于 12-24 08:00 ?25次下載

    IT工程師之間對接代碼一些

    最近沉浸在代碼的世界里,沒什么輸入,也沒什么輸出,今天說說碼農(nóng)之間對接代碼一些事吧。
    的頭像 發(fā)表于 05-07 16:49 ?3050次閱讀

    常見的PCB設(shè)計錯誤有哪一些

    有許多方法可以避免大多數(shù)常見的PCB設(shè)計錯誤,包括遵循方法的最佳實(shí)踐,包括設(shè)計審查和與供應(yīng)商的協(xié)作,以及利用設(shè)計和原型設(shè)計技術(shù)。
    的頭像 發(fā)表于 08-15 19:31 ?1750次閱讀

    導(dǎo)致PCB組裝的常見錯誤有哪一些

    導(dǎo)致PCB組裝的常見錯誤有哪一些
    的頭像 發(fā)表于 09-08 12:38 ?4186次閱讀

    對于代碼規(guī)范的一些總結(jié)

    都說代碼是程序員的第二張臉,長時間下來,寫的好的代碼定會受到大家的尊重。遵循一些簡單的規(guī)范,寫干凈致的代碼!把個性用在寫出最簡單易懂的
    的頭像 發(fā)表于 12-08 10:21 ?3430次閱讀

    機(jī)器學(xué)習(xí)的一些代碼示例合集

    本文檔的主要內(nèi)容詳細(xì)介紹的是機(jī)器學(xué)習(xí)的一些代碼示例合集。
    發(fā)表于 04-29 08:00 ?1次下載
    機(jī)器學(xué)習(xí)的<b class='flag-5'>一些</b><b class='flag-5'>代碼</b>示例合集

    Python中有哪些常見錯誤和異常

    按照 Python 的語法規(guī)則來,所以直接拋出了語法錯誤。 if File "", line 1 if ^SyntaxError: invalid syntax 還有一些錯誤,則是不可預(yù)料的
    的頭像 發(fā)表于 03-04 16:58 ?4218次閱讀

    Linux C開發(fā)中的一些常用的調(diào)試技巧

    在Linux使用gcc編譯程序的時候,對于調(diào)試的語句還具有一些特殊的語法。
    發(fā)表于 06-01 09:03 ?260次閱讀

    分享一些Python代碼加速工具

    這篇文章會提供一些優(yōu)化代碼的工具。會讓代碼變得更簡潔,或者更迅速。
    發(fā)表于 07-07 11:18 ?414次閱讀

    c語言代碼錯誤怎么找

    當(dāng)我們編寫C語言代碼時,常常會遇到一些錯誤。這些錯誤可能是語法錯誤,邏輯錯誤或者是運(yùn)行時
    的頭像 發(fā)表于 11-24 10:05 ?4317次閱讀

    串口通信常見錯誤和故障排除方法

    在進(jìn)行串口通信時,確實(shí)可能會遇到一些常見錯誤和問題。
    的頭像 發(fā)表于 03-02 14:19 ?4246次閱讀

    介紹一些常見的Modbus IO通信錯誤代碼及其含義

    Modbus IO通信協(xié)議中的錯誤代碼通常用于標(biāo)識通信過程中出現(xiàn)的錯誤或異常情況。
    的頭像 發(fā)表于 03-06 09:03 ?2859次閱讀
    真人百家乐对决| 罗平县| 网上百家乐官网内幕| 百家乐小型抽水泵| 大三元百家乐的玩法技巧和规则 | 大发888官方网站登陆| 天长市| 百家乐视频计牌器| 金杯百家乐的玩法技巧和规则 | 百家乐怎赌才赢钱| 百家乐官网送彩金平台| 盐城百家乐官网的玩法技巧和规则| 雅加达百家乐的玩法技巧和规则| 澳博娱乐| 做生意风水门面要求| 超级大赢家| 个体老板做生意的风水| 克拉克百家乐试玩| 博彩网百家乐的玩法技巧和规则| 新田县| 百家乐波音平台导航网| 百家乐官网出千大全| 百家乐防伪筹码套装| 久盛国际娱乐城| 做生意的风水朝向| 墨脱县| 全讯网纯净版| OG百家乐官网大转轮| 神人百家乐赌场| 免费下百家乐官网赌博软件 | 单机百家乐官网在线小游戏| 女性做生意的风水| 至尊百家乐官网规则| 百家乐网页游戏网址| 足球投注| 金城百家乐平台| 百家乐官网电投| 百家乐平注秘籍| 百家乐官网算牌e世博| 北京太阳城三期| 百家乐官网高手论|