两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

程序調(diào)試方法及系統(tǒng)的制作方法

文檔序號(hào):6607516閱讀:222來(lái)源:國(guó)知局

專利名稱::程序調(diào)試方法及系統(tǒng)的制作方法程序調(diào)試方法及系統(tǒng)
技術(shù)領(lǐng)域
:本發(fā)明涉及軟件設(shè)計(jì)領(lǐng)域,特別涉及一種程序調(diào)試方法及系統(tǒng)。
背景技術(shù)
:在軟件設(shè)計(jì)領(lǐng)域,調(diào)試是開發(fā)過(guò)程中必不可少的環(huán)節(jié),通用的桌面操作系統(tǒng)與嵌入式操作系統(tǒng)在調(diào)試環(huán)境上存在明顯的差別。前者,調(diào)試器與被調(diào)試的程序往往是運(yùn)行在同一臺(tái)機(jī)器的相同的操作系統(tǒng)上的兩個(gè)進(jìn)程,調(diào)試器進(jìn)程通過(guò)操作系統(tǒng)專門提供的調(diào)用接口(早期UNIX系統(tǒng)的ptrace調(diào)用、如今的進(jìn)程文件系統(tǒng)等)控制、訪問(wèn)被調(diào)試程序進(jìn)程。后者(又稱為遠(yuǎn)程調(diào)試),為了向系統(tǒng)開發(fā)人員提供靈活、方便的調(diào)試界面,調(diào)試器還是運(yùn)行于通用桌面操作系統(tǒng)的應(yīng)用程序,被調(diào)試的程序則運(yùn)行于基于特定硬件平臺(tái)的嵌入式操作系統(tǒng)(也稱目標(biāo)操作系統(tǒng))。這就帶來(lái)以下問(wèn)題調(diào)試器與被調(diào)試程序如何通信,被調(diào)試程序產(chǎn)生異常如何及時(shí)通知調(diào)試器,調(diào)試器如何控制、訪問(wèn)被調(diào)試程序,調(diào)試器如何識(shí)別有關(guān)被調(diào)試程序的多任務(wù)信息并控制某一特定任務(wù),調(diào)試器如何處理某些與目標(biāo)硬件平臺(tái)相關(guān)的信息(如目標(biāo)平臺(tái)的寄存器信息、機(jī)器代碼的反匯編等)??傊?,嵌入式系統(tǒng)的開發(fā)調(diào)試是比較困難的。而在現(xiàn)有技術(shù)中使用最為廣泛的一種嵌入式系統(tǒng)開發(fā)調(diào)試方式,就是通過(guò)目標(biāo)機(jī)器上的UART接口或者USB接口向系統(tǒng)開發(fā)人員使用的電腦上輸出調(diào)試信息。這些系統(tǒng)開發(fā)人員在設(shè)計(jì)程序時(shí),在可能出現(xiàn)程序錯(cuò)誤的位置加入檢驗(yàn)機(jī)制,以便在程序出錯(cuò)后打印特定的字符串來(lái)充當(dāng)調(diào)試信息。但是這種方法存在以下一些缺點(diǎn)1.由于程序運(yùn)行可能出錯(cuò)的地方很多,從理論上講每一次的函數(shù)調(diào)用都有可能出錯(cuò),因此嚴(yán)謹(jǐn)?shù)某绦蛘{(diào)試應(yīng)該判斷每一次函數(shù)調(diào)用的返回值。但是如果每個(gè)函數(shù)調(diào)用都設(shè)計(jì)一次錯(cuò)誤輸出信息,那么設(shè)計(jì)錯(cuò)誤輸出信息的工作量就占了整個(gè)編碼工作的很大一部分;2.很多錯(cuò)誤類型都是一致的,例如動(dòng)態(tài)分配內(nèi)存失敗,可能在程序運(yùn)行的許多地方都會(huì)出現(xiàn)。如果同類型錯(cuò)誤都輸出相同的錯(cuò)誤信息,則無(wú)法迅速找到出錯(cuò)位置;如果打印不同的信息,則不僅技術(shù)難度較高而且工作量也大;3.由于實(shí)際設(shè)計(jì)時(shí)設(shè)計(jì)唯一確定的輸出信息的難度較大,所以導(dǎo)致系統(tǒng)開發(fā)人員經(jīng)常忽略某些不常出現(xiàn)的錯(cuò)誤,會(huì)導(dǎo)致程序隱藏一些缺陷。同時(shí),設(shè)計(jì)的錯(cuò)誤輸出信息也不好清除,在產(chǎn)品正式量產(chǎn)后還可能遺留在產(chǎn)品中。因此,亟待提出一種先進(jìn)的、可以克服上述缺點(diǎn)的技術(shù)方案。
發(fā)明內(nèi)容本發(fā)明的目的在于提供一種程序調(diào)試方法及系統(tǒng),其利用編譯器自動(dòng)生成錯(cuò)誤信息,有利于快速定位程序出錯(cuò)位置。為了達(dá)到本發(fā)明的目的,根據(jù)本發(fā)明的一個(gè)方面,本發(fā)明提供一種應(yīng)用于嵌入式開發(fā)平臺(tái)的程序調(diào)試方法,所述方法包括設(shè)定一個(gè)宏定義或自定義庫(kù)函數(shù),所述宏定義或自定義庫(kù)函數(shù)內(nèi)包括一邏輯,該邏輯判斷程序運(yùn)行到某一點(diǎn)時(shí)的當(dāng)前值是否為期望值,如不是,則打印當(dāng)前文件名和行號(hào);和在需要檢驗(yàn)的程序部位加入所述宏定義或自定義庫(kù)函3數(shù)。進(jìn)一步地,所述打印當(dāng)前文件名和行號(hào)是通過(guò)編程語(yǔ)言的預(yù)定義宏實(shí)現(xiàn)的。進(jìn)一步地,除了打印當(dāng)前文件名和行號(hào)外,還打印函數(shù)名。進(jìn)一步地,所述程序采用C語(yǔ)言或者C++語(yǔ)言實(shí)現(xiàn)。進(jìn)一步地,所述宏定義或者自定義庫(kù)函數(shù)在打印當(dāng)前文件名和行號(hào)后,還包括停止當(dāng)前程序運(yùn)行。根據(jù)本發(fā)明的另一方面,本發(fā)明還提供一種應(yīng)用于嵌入式開發(fā)平臺(tái)的程序調(diào)試系統(tǒng),所述系統(tǒng)包括編譯器,編譯包括預(yù)定宏定義或自定義庫(kù)函數(shù)的待調(diào)試程序,所述預(yù)定宏定義或自定義庫(kù)函數(shù)內(nèi)包括判斷程序運(yùn)行到某一點(diǎn)時(shí)的當(dāng)前值是否為期望值,如不是,則打印當(dāng)前文件名和行號(hào)的邏輯;和調(diào)試器,如果在所述程序運(yùn)行到所述點(diǎn)時(shí)當(dāng)前值不是期望值,打印所述點(diǎn)所處的文件名和行號(hào)。進(jìn)一步地,所述調(diào)試器除了打印當(dāng)前文件名和行號(hào)外,還打印函數(shù)名。進(jìn)一步地,所述程序采用C語(yǔ)言或者C++語(yǔ)言實(shí)現(xiàn)。進(jìn)一步地,所述調(diào)試器在打印當(dāng)前文件名和行號(hào)后,還停止當(dāng)前程序運(yùn)行。與現(xiàn)有技術(shù)相比,本發(fā)明通過(guò)利用宏定義或者自定義庫(kù)函數(shù)機(jī)制,簡(jiǎn)化了系統(tǒng)開發(fā)人員在設(shè)計(jì)調(diào)試信息時(shí)的工作步驟;本發(fā)明通過(guò)直接利用編程語(yǔ)言內(nèi)部的預(yù)定義宏,實(shí)現(xiàn)了簡(jiǎn)潔的錯(cuò)誤信息輸出;本發(fā)明通過(guò)出錯(cuò)后打印的調(diào)試信息(文件名、行號(hào)或者函數(shù)名),實(shí)現(xiàn)了程序出錯(cuò)位置的快速定位。結(jié)合參考附圖及接下來(lái)的詳細(xì)描述,本發(fā)明將更容易理解,其中同樣的附圖標(biāo)記對(duì)應(yīng)同樣的結(jié)構(gòu)部件,其中圖1為本發(fā)明中程序調(diào)試方法的方法流程圖;圖2為本發(fā)明中宏定義或者庫(kù)函數(shù)的工作步驟;和圖3為本發(fā)明中程序調(diào)試系統(tǒng)在一個(gè)實(shí)施例中的結(jié)構(gòu)方框圖。具體實(shí)施方式為使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí)施方式對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說(shuō)明。本發(fā)明所述程序調(diào)試方法主要應(yīng)用于嵌入式開發(fā)環(huán)境,所述嵌入式開發(fā)環(huán)境使用的編程語(yǔ)言可以是C語(yǔ)言或者C++。請(qǐng)參考圖1,其示出了本發(fā)明中程序調(diào)試方法100的方法流程圖。所述程序調(diào)試方法100包括步驟102,設(shè)定一個(gè)宏定義或者自定義庫(kù)函數(shù),所述宏定義或自定義庫(kù)函數(shù)內(nèi)包括一邏輯,該邏輯判斷程序運(yùn)行到某一點(diǎn)時(shí)的當(dāng)前值是否為期望值,如不是,則打印當(dāng)前文件名和行號(hào);及步驟104,在需要檢驗(yàn)的程序部位加入所述宏定義或者自定義庫(kù)函數(shù)。在C語(yǔ)言及其相似類型的編程語(yǔ)言中,宏是一種預(yù)處理指令,它提供了一種機(jī)制,可以用來(lái)替換源代碼中的字符串,宏通常是用“《define"語(yǔ)句定義的。通俗來(lái)講,系統(tǒng)開發(fā)人員可以將經(jīng)常使用的一些字符串、常量等等在軟件的開頭部位預(yù)先聲明定義用一個(gè)特定字符串來(lái)代表,然后在后續(xù)的軟件設(shè)計(jì)時(shí)通過(guò)這個(gè)特定的字符串來(lái)代表那些被聲明了的字4符串、常量等等。在具體的程序被編譯時(shí),編譯器會(huì)自動(dòng)將這個(gè)特定的字符串替換為那些被聲明了的字符串、常量。在標(biāo)準(zhǔn)C語(yǔ)言中,編譯器內(nèi)部包括一些經(jīng)常使用的預(yù)定義宏,諸如—FILE—、—LINE—和—FUNCTION—?!狥ILE—是代表當(dāng)前源代碼文件名的字符串文字;—LINE—是代表當(dāng)前源代碼中的行號(hào)的整數(shù)常量;—FUNCTION—代表當(dāng)前所在函數(shù)名。具體的宏定義、預(yù)定義宏的使用方法本領(lǐng)域技術(shù)人員應(yīng)當(dāng)了解,本文不做深入講解,詳細(xì)資料可以參照各標(biāo)準(zhǔn)C語(yǔ)言的技術(shù)文檔。本發(fā)明中充分利用預(yù)定義宏—FILE—、—LINE—和—FUNCTION—的特性,設(shè)計(jì)一個(gè)用于調(diào)試程序的宏定義,所述宏定義的工作步驟包括判斷程序運(yùn)行到某一點(diǎn)時(shí)的當(dāng)前值是否為期望值,如不是,則利用預(yù)定義宏—FILE—和—LINE—打印當(dāng)前文件名和行號(hào)。當(dāng)然也可以利用預(yù)定義宏—FUNCTION—打印當(dāng)前函數(shù)名。程序調(diào)試時(shí)檢驗(yàn)程序是否出錯(cuò)通常檢驗(yàn)三種1、代碼執(zhí)行之前必須具備的特性,比如變量a必須在進(jìn)入函數(shù)A前是正數(shù);2、代碼執(zhí)行之后必須具備的特性,比如函數(shù)B的返回值b應(yīng)當(dāng)是負(fù)數(shù);3、代碼執(zhí)行前后不能變化的特性,比如一些變量在不同函數(shù)之間傳遞參數(shù)時(shí)的需要。不論哪一種,都可以通過(guò)判斷機(jī)制來(lái)檢驗(yàn)程序運(yùn)行時(shí)的情況是否與預(yù)先設(shè)計(jì)的情況相吻合,當(dāng)不吻合時(shí)給出出錯(cuò)信息。步驟102設(shè)定的宏定義正是用來(lái)檢驗(yàn)程序是否出錯(cuò)的。為了更詳盡的描述本發(fā)明,圖2進(jìn)一步說(shuō)明了步驟102設(shè)定的宏定義的工作步驟200。所述宏定義的工作步驟200包括步驟202,檢驗(yàn)程序運(yùn)行時(shí)的當(dāng)前值是否為設(shè)計(jì)程序時(shí)的期望值,如果是,則進(jìn)行步驟204,即不做任何處理;如果不是,則代表程序出錯(cuò)了,進(jìn)行步驟206,即打印當(dāng)前源代碼所處的文件名和行號(hào);如果需要停止程序繼續(xù)運(yùn)行,進(jìn)行步驟208,中斷當(dāng)前程序。在一個(gè)具體的實(shí)施例中,所述宏定義MMD_ASSERT的設(shè)定格式可以如下#defineMMD_ASSERT(_X_){if(!_X_)判斷當(dāng)前值是否為期望值***/VIM_UART_Printf("\nAsserterrorat%S,Line=%d",_FlLE_,_LINE_);/***打印當(dāng)前文件名和行號(hào)***/While(I);}}/#*使程序陷入死循環(huán),中斷運(yùn)行***/其中_X_用來(lái)判斷當(dāng)前值是否為期望值,_X_在當(dāng)前值是期望值時(shí)為真;當(dāng)然,_X_在當(dāng)前值不是期望值時(shí)為假,可以根據(jù)具體實(shí)施環(huán)境令_χ_等于不同的判斷條件。不同的技術(shù)人員根據(jù)具體應(yīng)用環(huán)境可能對(duì)所述宏定義有不同的修改,還可能使用類似手段來(lái)實(shí)現(xiàn)所述宏定義的功能,例如利用自定義庫(kù)函數(shù)來(lái)代替所述宏定義,例如設(shè)計(jì)一個(gè)頭文件vim_assert,h,文件內(nèi)容如下intMMD_ASSERT1(a){if(!a)Printf("\nAsserterrorat%S,Line=%d,,,—FILE—,—LINE—);While(I);}}/***MMD_ASSERT1可以打印文件名和行號(hào)***/intMMD_ASSERT2(b){if(!b)Printf("\nAsserterrorat%S,Function=%S,,,—FILE—,—FUNCTION—);While(I);}}5/*#MMD_ASSERT2可以打印文件名和函數(shù)名***/intMMD_ASSERT3(c){if(!c)Printf("\nAsserterrorat%S,Function=%S,Line=%d。,,,—FILE—,_LINE_,—FUNCTION—);While(I);}}/***MMD_ASSERT3可以打印文件名、行號(hào)和函數(shù)名***/將這個(gè)頭文件vim_aSSert.h放在編譯器可以找到的路徑,并且在需要使用的程序頭加入“include〈路徑\vim_assert.h>”也可以達(dá)到同樣的效果。在步驟104中,系統(tǒng)開發(fā)人員只需要在程序中需要檢驗(yàn)的部位適當(dāng)?shù)丶尤氩襟E102中設(shè)定的宏定義或者自定義庫(kù)函數(shù)即可。譬如在聲明了宏定義MMD_ASSERT的程序中,文件XXX.c中的函數(shù)A的返回值a應(yīng)當(dāng)?shù)扔?,則在函數(shù)A的下一行(該文件16行)加入MMD_ASSERT(a=3),當(dāng)a不等于3時(shí),程序就會(huì)返回錯(cuò)誤信息Asserterroratxxx.c,Line=16。應(yīng)當(dāng)認(rèn)識(shí)到,本發(fā)明應(yīng)用于嵌入式系統(tǒng)開發(fā)調(diào)試時(shí)輸出的錯(cuò)誤信息直接對(duì)應(yīng)出錯(cuò)位置,系統(tǒng)開發(fā)人員可以利用輸出的錯(cuò)誤信息方便快捷地進(jìn)行程序調(diào)試。而且在設(shè)計(jì)時(shí)不需要像現(xiàn)有技術(shù)中具體設(shè)計(jì)錯(cuò)誤輸出信息和錯(cuò)誤處理操作,所述程序調(diào)試方法簡(jiǎn)單快捷。最后當(dāng)產(chǎn)品調(diào)試完畢,不需要錯(cuò)誤信息輸出時(shí)只需要將軟件頭部的宏定義修改為空即可,大大減少了系統(tǒng)開發(fā)人員的工作量?;谒龀绦蛘{(diào)試方法,本發(fā)明還提供一種程序調(diào)試系統(tǒng),應(yīng)用于嵌入式開發(fā)平臺(tái),請(qǐng)參考圖3,其示出了本發(fā)明中程序調(diào)試系統(tǒng)300在一個(gè)實(shí)施例中的結(jié)構(gòu)方框圖。所述程序調(diào)試系統(tǒng)300包括編譯器302和調(diào)試器304。所述編譯器302編譯包括預(yù)定宏定義或自定義庫(kù)函數(shù)的待調(diào)試程序,所述預(yù)定宏定義或自定義庫(kù)函數(shù)內(nèi)包括判斷程序運(yùn)行到一點(diǎn)的當(dāng)前值是否為期望值,如不是,則打印當(dāng)前文件名和行號(hào)的邏輯。由于所述待調(diào)試程序通常采用C語(yǔ)言或者C++來(lái)實(shí)現(xiàn),所以所述編譯器302的編譯方式也可以與標(biāo)準(zhǔn)C語(yǔ)言或者C++的編譯器相同,所述編譯方式也包括從源代碼(sourcecode)—預(yù)處理器(preprocessor)—編譯器(compiler)—匯編程序(assembler)—目標(biāo)代碼(objectcode)—鏈接器(Linker)—可執(zhí)行程序的(executables)的全部編譯過(guò)程,直到源代碼翻譯成直接能被計(jì)算機(jī)或虛擬機(jī)執(zhí)行的目標(biāo)代碼(通常為低階語(yǔ)言或機(jī)器語(yǔ)言)。如果在所述程序運(yùn)行到所述點(diǎn)時(shí)當(dāng)前值不是期望值,則所述調(diào)試器304打印所述點(diǎn)所在的文件名和行號(hào)。當(dāng)然根據(jù)所述預(yù)定宏定義或自定義庫(kù)函數(shù)內(nèi)不同的邏輯,所述調(diào)試器還可以打印函數(shù)名和在程序出錯(cuò)時(shí)停止當(dāng)前程序運(yùn)行以便于系統(tǒng)開發(fā)人員調(diào)試。上述說(shuō)明已經(jīng)充分揭露了本發(fā)明的具體實(shí)施方式。需要指出的是,熟悉該領(lǐng)域的技術(shù)人員對(duì)本發(fā)明的具體實(shí)施方式所做的任何改動(dòng)均不脫離本發(fā)明的權(quán)利要求書的范圍。相應(yīng)地,本發(fā)明的權(quán)利要求的范圍也并不僅僅局限于所述具體實(shí)施方式。權(quán)利要求一種程序調(diào)試方法,應(yīng)用于嵌入式開發(fā)平臺(tái),其特征在于,其包括設(shè)定一個(gè)宏定義或自定義庫(kù)函數(shù),所述宏定義或自定義庫(kù)函數(shù)內(nèi)包括一邏輯,該邏輯判斷程序運(yùn)行到某一點(diǎn)時(shí)的當(dāng)前值是否為期望值,如不是,則打印當(dāng)前文件名和行號(hào);和在需要檢驗(yàn)的程序部位加入所述宏定義或自定義庫(kù)函數(shù)。2.根據(jù)權(quán)利要求1所述的程序調(diào)試方法,其特征在于,所述打印當(dāng)前文件名和行號(hào)是通過(guò)編程語(yǔ)言的預(yù)定義宏實(shí)現(xiàn)的。3.根據(jù)權(quán)利要求1所述的程序調(diào)試方法,其特征在于,除了打印當(dāng)前文件名和行號(hào)外,還打印函數(shù)名。4.根據(jù)權(quán)利要求1所述的程序調(diào)試方法,其特征在于,所述程序采用C語(yǔ)言或者C++語(yǔ)言實(shí)現(xiàn)。5.根據(jù)權(quán)利要求1所述的程序調(diào)試方法,其特征在于,所述宏定義或者自定義庫(kù)函數(shù)在打印當(dāng)前文件名和行號(hào)后,還包括停止當(dāng)前程序運(yùn)行。6.一種程序調(diào)試系統(tǒng),應(yīng)用于嵌入式開發(fā)平臺(tái),其特征在于,其包括編譯器,編譯包括預(yù)定宏定義或自定義庫(kù)函數(shù)的待調(diào)試程序,所述預(yù)定宏定義或自定義庫(kù)函數(shù)內(nèi)包括判斷程序運(yùn)行到某一點(diǎn)時(shí)的當(dāng)前值是否為期望值,如不是,則打印當(dāng)前文件名和行號(hào)的邏輯;和調(diào)試器,如果在所述程序運(yùn)行到所述點(diǎn)時(shí)當(dāng)前值不是期望值,打印所述點(diǎn)所處的文件名和行號(hào)。7.根據(jù)權(quán)利要求6所述的程序調(diào)試系統(tǒng),其特征在于,所述調(diào)試器除了打印當(dāng)前文件名和行號(hào)外,還打印函數(shù)名。8.根據(jù)權(quán)利要求6所述的程序調(diào)試系統(tǒng),其特征在于,所述程序采用C語(yǔ)言或者C++語(yǔ)言實(shí)現(xiàn)。9.根據(jù)權(quán)利要求6所述的程序調(diào)試系統(tǒng),其特征在于,所述調(diào)試器在打印當(dāng)前文件名和行號(hào)后,還停止當(dāng)前程序運(yùn)行。全文摘要本發(fā)明揭露了一種應(yīng)用于嵌入式開發(fā)平臺(tái)的程序調(diào)試方法,所述方法包括設(shè)定一個(gè)宏定義或自定義庫(kù)函數(shù),所述宏定義或自定義庫(kù)函數(shù)內(nèi)包括一邏輯,該邏輯判斷程序運(yùn)行到一點(diǎn)時(shí)的當(dāng)前值是否為期望值,如不是,則打印當(dāng)前文件名和行號(hào);和在需要檢驗(yàn)的程序點(diǎn)加入所述宏定義或自定義庫(kù)函數(shù)?;谠摲椒ū景l(fā)明同時(shí)提出一種程序調(diào)試系統(tǒng)。本發(fā)明通過(guò)利用宏定義或者自定義庫(kù)函數(shù)機(jī)制,簡(jiǎn)化了系統(tǒng)開發(fā)人員在設(shè)計(jì)調(diào)試信息時(shí)的工作步驟;本發(fā)明通過(guò)直接利用編程語(yǔ)言內(nèi)部的預(yù)定義宏,實(shí)現(xiàn)了簡(jiǎn)潔的獨(dú)一無(wú)二的錯(cuò)誤信息輸出;本發(fā)明通過(guò)出錯(cuò)后打印的調(diào)試信息實(shí)現(xiàn)了程序出錯(cuò)位置的快速定位。文檔編號(hào)G06F11/36GK101916223SQ20101025033公開日2010年12月15日申請(qǐng)日期2010年8月11日優(yōu)先權(quán)日2010年8月11日發(fā)明者李志剛申請(qǐng)人:無(wú)錫中星微電子有限公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
阜新| 武安市| 南华县| 株洲市| 苏尼特右旗| 渭源县| 武宁县| 普安县| 同江市| 邻水| 刚察县| 海门市| 巫山县| 辛集市| 微山县| 湄潭县| 隆化县| 陆丰市| 威信县| 石林| 鄂尔多斯市| 雷州市| 靖西县| 永胜县| 江都市| 罗定市| 惠东县| 江陵县| 嘉义县| 吉木萨尔县| 杭锦旗| 新蔡县| 揭西县| 淮阳县| 怀远县| 勃利县| 曲沃县| 洞头县| 抚顺县| 台南市| 陆川县|