第一步,用編輯程序把編制的源程序按照一定的書(shū)寫(xiě)格式送到計(jì)算機(jī)中,編輯程序會(huì)根據(jù)使用人員的意圖對(duì)源程序進(jìn)行增、刪或修改。
第二步,把送入的源程序翻譯成機(jī)器語(yǔ)言,即用編譯程序?qū)υ闯绦蜻M(jìn)行語(yǔ)法檢查并將符合語(yǔ)法規(guī)則的源程序語(yǔ)句翻譯成計(jì)算機(jī)能識(shí)別的“語(yǔ)言”。如果經(jīng)編譯程序檢查,發(fā)現(xiàn)有語(yǔ)法錯(cuò)誤,那就必須用編輯程序來(lái)修改源程序中的語(yǔ)法錯(cuò)誤,然后再編譯,直至沒(méi)有語(yǔ)法錯(cuò)誤為止。
第三步,使用計(jì)算機(jī)中的連接程序,把翻譯好的計(jì)算機(jī)語(yǔ)言程序連接起來(lái),并扶植成一個(gè)計(jì)算機(jī)能真正運(yùn)行的程序。在連接過(guò)程中,一般不會(huì)出現(xiàn)連接錯(cuò)誤,如果出現(xiàn)了連接錯(cuò)誤,說(shuō)明源程序中存在子程序的調(diào)用混亂或參數(shù)傳遞錯(cuò)誤等問(wèn)題。這時(shí)又要用編輯程序?qū)υ闯绦蜻M(jìn)行修改,再進(jìn)行編譯和連接,如此反復(fù)進(jìn)行,直至沒(méi)有連接錯(cuò)誤為止。
第四步,將修改后的程序進(jìn)行試算,這時(shí)可以假設(shè)幾個(gè)模擬數(shù)據(jù)去試運(yùn)行,并把輸出結(jié)果與手工處理的正確結(jié)果相比較。如有差異,就表明計(jì)算機(jī)的程序存在有邏輯錯(cuò)誤。如果程序不大,可以用人工方法去模擬計(jì)算機(jī)對(duì)源程序的這幾個(gè)數(shù)據(jù)進(jìn)行修改處理;如果程序比較大,人工模擬顯然行不通,這時(shí)只能將計(jì)算機(jī)設(shè)置成單步執(zhí)行的方式,一步步跟蹤程序的運(yùn)行。一旦找到問(wèn)題所在,仍然要用編輯程序來(lái)修改源程序,接著仍要編譯、連接和執(zhí)行,直至無(wú)邏輯錯(cuò)誤為止。也可以在完成后再進(jìn)行編譯。
1. 直接輸入、更改、跟蹤、運(yùn)行匯編程序 2. 觀察操作系統(tǒng)的內(nèi)容;? 3. 查看ROM BIOS的內(nèi)容;? 4. 觀察更改RAM內(nèi)部的設(shè)置值;? 5. 以扇區(qū)或文件的方式讀寫(xiě)軟盤(pán)數(shù)據(jù)。? 在DEBUG中地址用段地址與段內(nèi)地址來(lái)表示,而段地址可以明確地指出來(lái),也可以用一個(gè)段指示器(段寄存器)來(lái)代表,用段寄存器表示時(shí),其段地址就是此寄存器的內(nèi)含值:? 如:用段地址和段內(nèi)地址表示FOFF:0100? 用段寄存器和段內(nèi)地址表示CSF:0100←CS指向F000? 下面列出了常用命令用法。 -A 地址 從指定地址開(kāi)始編寫(xiě)小匯編程序,按兩個(gè)回車(chē)鍵結(jié)束編輯 -U 地址 從指定地址開(kāi)始反匯編32字節(jié)的機(jī)器指令,缺省地址則從上一U命令繼續(xù) -D 始址 終址 以16進(jìn)制/Asc字符對(duì)照方式顯示指定內(nèi)存范圍的數(shù)據(jù),每行顯示10H個(gè)字節(jié) -E 地址 值表 用給出的值表(空格分隔)替換指定地址開(kāi)始的內(nèi)存單元,例:-E 100 'v' 1F 'hello' -N 文件名 為后續(xù)的L/W命令約定所操作的文件名 -L 地址 將N命令所指定文件的內(nèi)容讀入到指定內(nèi)存位置。另,邏輯卷扇區(qū)直接讀:-L 地址 邏卷號(hào) 起始邏扇號(hào) 扇數(shù) -W 地址 將BX-CX個(gè)字節(jié)的內(nèi)存數(shù)據(jù)寫(xiě)入N命令指定的文件中。另,邏輯卷扇區(qū)直接寫(xiě):-W 地址 邏卷號(hào) 起始邏扇號(hào) 扇數(shù) -R 寄存器名 顯示并允許修改指定寄存器的值 -G=始址 終址 執(zhí)行指定內(nèi)存中的機(jī)器指令程序 -T=地址 單步執(zhí)行機(jī)器指令,缺省地址則從上一T命令繼續(xù)。另,繼續(xù)跟蹤m條指令:-T m 讀取c:卷的引導(dǎo)扇區(qū),并保存到Boot.1文件中,并簡(jiǎn)單分析引導(dǎo)程序的前面幾條指令: -L 1000 2 0 1 -N boot.1 -R bx ;輸入0000 -R cx ;輸入0200 -W 1000 -U 1000 讀取第一個(gè)硬盤(pán)上的主引導(dǎo)扇區(qū),并保存到MB.1文件中,在屏幕上顯示硬盤(pán)分區(qū)表數(shù)據(jù): -A 100 yyyy:0100 mov dx,0080 yyyy:01xx mov cx,0001 yyyy:01xx mov ax,yyyy yyyy:01xx mov es,ax yyyy:01xx mov bx,1000 yyyy:01xx mov ax,0201 yyyy:01xx int 13 yyyy:01zz nop -G=yyyy:0100 01zz -N mb.1 -R bx ;輸入0000 -R cx ;輸入0200 -W 1000 -D 11be 11ff debugging命令 debugging命令概述 獲得路由器中交換的報(bào)文和幀的細(xì)節(jié)信息 用于調(diào)試信息 debugging命令使用注意事項(xiàng) 不使用debug命令監(jiān)控正常的網(wǎng)絡(luò)運(yùn)行 在網(wǎng)絡(luò)使用的低峰期使用 不要輕易使用類(lèi)似debugging all之類(lèi)的命令 使用debugging命令后,應(yīng)立即以“undo debugging”命令終止debugging命令的執(zhí)行。 Debugger "Debugger"這個(gè)詞按它的英文字面意思來(lái)講是這樣一種“裝置”(-er),這種裝置可以“消除”(De-)“系統(tǒng)中的缺陷”(bug)。然而事實(shí)上,迄今為止我們經(jīng)常使用到的"Debugger"只是用來(lái)幫助我們進(jìn)行Debug的工具,"Debugger"本身不能自動(dòng)完成"Debug"。我們可以回想一下我們是如何進(jìn)行Debug的,在進(jìn)行Debug的過(guò)程中,我們通過(guò)Debugger來(lái)完成以下工作: (1)監(jiān)視“Debug對(duì)象”的狀態(tài); (2)控制“Debug對(duì)象”的運(yùn)行; 這些工作可以為“發(fā)現(xiàn)Debug對(duì)象中存在的問(wèn)題”以及“對(duì)解決問(wèn)題方案的檢驗(yàn)”提供有用的信息。 監(jiān)控工作有時(shí)只需要由軟件就可以完成,有時(shí)不僅需要軟件支持,還需要硬件的支持。 Debugger除了被用來(lái)Debug,還被用來(lái)幫助我們理解“Debug的對(duì)象”內(nèi)部結(jié)構(gòu),因?yàn)槲覀冇玫降腄ebugger能夠完成對(duì)“Debug對(duì)象”的監(jiān)控工作,在監(jiān)控的過(guò)程中可以獲取“Debug對(duì)象”動(dòng)態(tài)特征的信息,這對(duì)我們理解其結(jié)構(gòu)是非常有用的。 關(guān)于更詳細(xì)的介紹和研究可以參考國(guó)人原創(chuàng)的《軟件調(diào)試》 ,這
[url= ]嫦娥二號(hào)直播[/url]
要了解調(diào)試程序的最好方法,首先要分析一下調(diào)試過(guò)程的三個(gè)要素:應(yīng)該用什么工具調(diào)試一個(gè)程序?用什么辦法才能找出程序中的錯(cuò)誤?怎樣才能從一開(kāi)始就避免錯(cuò)誤?應(yīng)該用什么工具調(diào)試一個(gè)程序?有經(jīng)驗(yàn)的程序員會(huì)使用許多工具來(lái)幫助調(diào)試程序,包括一組調(diào)試程序和一些"lint”程序,當(dāng)然,編譯程序本身也是一種調(diào)試工具。
在檢查程序中的邏輯錯(cuò)誤時(shí),調(diào)試程序是特別有用的,因此許多程序員都把調(diào)試程序作為基本的調(diào)試工具。一般來(lái)說(shuō),調(diào)試程序能幫助程序員完成以下工作:(1)觀察程序的運(yùn)行情況 僅這項(xiàng)功能就使一個(gè)典型的調(diào)試程序具備了不可估量的價(jià)值。
即使你花了幾個(gè)月的時(shí)間精心編寫(xiě)了一個(gè)程序,你也不一定完全清楚這個(gè)程序每一步的運(yùn)行情況。如果程序員忘記了某些if語(yǔ)句、函數(shù)調(diào)用或分支程序,可能會(huì)導(dǎo)致某些程序段被跳過(guò)或執(zhí)行,而這種結(jié)果并不是程序員所期望的。
不管怎樣,在程序的執(zhí)行過(guò)程中,尤其是當(dāng)程序有異常表現(xiàn)時(shí),如果程序員能隨時(shí)查看當(dāng)前被執(zhí)行的是那幾行代碼,那么他就能很好地了解程序正在做什么以及錯(cuò)誤發(fā)生在什么地方。(2)設(shè)置斷點(diǎn) 通過(guò)設(shè)置斷點(diǎn)可以使程序在執(zhí)行到某一點(diǎn)時(shí)暫時(shí)停住。
當(dāng)你知道錯(cuò)誤發(fā)生在程序的哪一部分時(shí),這種方法是特別有用的。你可以把斷點(diǎn)設(shè)置在有問(wèn)題的程序段的前面、中間或后面。
當(dāng)程序執(zhí)行到斷點(diǎn)時(shí),就會(huì)暫時(shí)停住,此時(shí)你可以檢查所有局部變量、參數(shù)和全局變量的值。如果一切正常,可以繼續(xù)執(zhí)行程序,直到遇到另一個(gè)斷點(diǎn),或者直到引起問(wèn)題的原因暴露出來(lái)。
(3)設(shè)置監(jiān)視 程序員可以通過(guò)調(diào)試程序監(jiān)視一個(gè)變量,即連續(xù)地監(jiān)視一個(gè)變量的值或內(nèi)容。如果你清楚一個(gè)變量的取值范圍或有效內(nèi)容,那么通過(guò)這種方法就能很快地找出錯(cuò)誤的原因。
此外,你可以讓調(diào)試程序替你監(jiān)視變量,并且在某個(gè)變量超出預(yù)先定義的取值范圍或某個(gè)條件滿足時(shí)使程序暫停執(zhí)行。如果你知道變量的所有行為,那么這么做是很方便的。
好的調(diào)試程序通常還提供一些其它功能來(lái)簡(jiǎn)化調(diào)試工作。然而,調(diào)試程序并不是唯一的調(diào)試工具,lint程序和編譯程序本身也能提供很有價(jià)值的手段來(lái)分析程序的運(yùn)行情況。
注意:lint程序能分辨數(shù)百種常見(jiàn)的編程錯(cuò)誤,并且能報(bào)告這些錯(cuò)誤發(fā)生在程序的哪一部分。盡管其中有一些并不是真正的錯(cuò)誤,但大部分還是有價(jià)值的。
lint程序和編譯程序所提供的一種典型功能是編譯時(shí)檢查(compile—time checks),這種功能是調(diào)試程序所不具備的。當(dāng)用這些工具編譯你的程序時(shí),它們會(huì)找出程序中有問(wèn)題的程序段,可能產(chǎn)生意想不到的效果的程序段,以及常見(jiàn)的錯(cuò)誤。
下面將分析幾個(gè)這種檢查方式的應(yīng)用例子,相信對(duì)你會(huì)有所幫助。等于運(yùn)算符的誤用 編譯時(shí)檢查有助于發(fā)現(xiàn)等于運(yùn)算符的誤用。
請(qǐng)看下述程序段: void foo(int a,int b) { if ( a = b ) { / * some code here * / } } 這種類(lèi)型的錯(cuò)誤一般很難發(fā)現(xiàn)!程序并沒(méi)有比較兩個(gè)變量,而是把b的值賦給了a,并且在b不為零的條件下執(zhí)行if體。一般來(lái)說(shuō),這并不是程序員所希望的(盡管有可能)。
這樣一來(lái),不僅有關(guān)的程序段將被執(zhí)行錯(cuò)誤的次數(shù),并且在以后用到變量a時(shí)其值也是錯(cuò)誤的。未初始化的變量 編譯時(shí)檢查有助于發(fā)現(xiàn)未初始化的變量。
請(qǐng)看下面的函數(shù):void average ( float ar[], int size ) { float total; int a; for( a = 0;a { total+=ar[a]; } printf(" %f\n", total / (float) size ); } 這里的問(wèn)題是變量total沒(méi)有被初始化,因此它很可能是一個(gè)隨機(jī)的無(wú)用的數(shù)。數(shù)組所有元素的值的和將與這個(gè)隨機(jī)數(shù)的值相加(這部分程序是正確的),然后輸出包括這個(gè)隨機(jī)數(shù)在內(nèi)的一組數(shù)的平均值。
變量的隱式類(lèi)型轉(zhuǎn)換 在有些情況下,C語(yǔ)言會(huì)自動(dòng)將一種類(lèi)型的變量轉(zhuǎn)換為另一種類(lèi)型。這可能是一件好事(程序員不用再做這項(xiàng)工作),但是也可能會(huì)產(chǎn)生意想不到的效果。
把指針類(lèi)型隱式轉(zhuǎn)換成整型恐怕是最糟糕的隱式類(lèi)型轉(zhuǎn)換。void sort( int ar[],int size ) { /* code to sort goes here * / } int main() { int arrgy[10]; sort( 10, array ); } 上述程序顯然不是程序員所期望的,雖然它的實(shí)際運(yùn)行結(jié)果難以預(yù)測(cè),但無(wú)疑是災(zāi)難性的。
用什么辦法才能找出程序中的錯(cuò)誤?在調(diào)試程序的過(guò)程中,程序員應(yīng)該記住以下幾種技巧:先調(diào)試程序中較小的組成部分,然后調(diào)試較大的組成部分 如果你的程序編寫(xiě)得很好,那么它將包含一些較小的組成部分,最好先證實(shí)程序的這些部分是正確的。盡管程序中的錯(cuò)誤并不一定發(fā)生在這些部分中,但是先調(diào)試它們有助于你理解程序的總體結(jié)構(gòu),并且證實(shí)程序的哪些部分不存在錯(cuò)誤。
進(jìn)一步地,當(dāng)你調(diào)試程序中較大的組成部分時(shí),你就可以確信那些較小的組成部分是正常工作的。徹底調(diào)試好程序的一個(gè)組成部分后,再調(diào)試下一個(gè)組成部分 這一點(diǎn)非常重要。
如果證實(shí)了程序的一個(gè)組成部分是正確的,不僅能縮小可能存在錯(cuò)誤的范圍,而且程序的其它組成部分就能安全地使用這部分程序了。這里應(yīng)用了一種很好的經(jīng)驗(yàn)性原則,簡(jiǎn)單地說(shuō)就是調(diào)試一段代碼的難度與這段代碼長(zhǎng)度的平方成正比,因此,調(diào)試一段20行的代碼比調(diào)試一段10行的代碼要難4倍。
因此,在調(diào)試過(guò)程中每次只把精力集中在一小段代碼上是很有幫助的。當(dāng)然,這僅僅是一個(gè)總的原則,具體使用時(shí)還要視。
這個(gè)跟你用什么調(diào)試器有一定關(guān)系
如果你用VC6.0的調(diào)試器,那么可能你的調(diào)試手段就會(huì)受一定限制,VC下主要就是
單步,步入,堆棧和寄存器的查看,變量的查看,普通斷點(diǎn),條件斷點(diǎn),內(nèi)存訪問(wèn)斷點(diǎn);
如果你用OllyDbg,那么除了上述手段外,還有硬斷點(diǎn),內(nèi)存讀/寫(xiě)斷點(diǎn)等
如果你用windbg的話,手段也很豐富,就是命令多了點(diǎn),可能需要你去記;
大多數(shù)調(diào)試器的常用手段就是我上面說(shuō)的那些了
使用VisualStudio2013編寫(xiě)和調(diào)試c語(yǔ)言程序步驟:1、打開(kāi)【文件】——【新建】——【項(xiàng)目】,打開(kāi)‘新建項(xiàng)目’窗口。
2、在【模板】選擇【Visual C++】,【win32控制臺(tái)應(yīng)用程序】,【名稱(chēng)】、【位置】、【解決方案名稱(chēng)】根據(jù)自己的需要填寫(xiě),不會(huì)填的話默認(rèn)即可。3、單擊【確定】彈出如下窗口:4、單擊【下一步】,出現(xiàn)如下窗口:在【空項(xiàng)目】前面的方框里打鉤,然后點(diǎn)擊【完成】。
5、【源文件】——右鍵【添加】——【新建項(xiàng)】這里【名稱(chēng)】里給自己的文件取個(gè)名字,選擇【C++文件(.cpp)】——【添加】,然后就可以編輯程序了。6、程序?qū)懞煤?,按【F5】調(diào)試,【Ctrl+F5】運(yùn)行。
聲明:本網(wǎng)站尊重并保護(hù)知識(shí)產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護(hù)條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請(qǐng)?jiān)谝粋€(gè)月內(nèi)通知我們,我們會(huì)及時(shí)刪除。
蜀ICP備2020033479號(hào)-4 Copyright ? 2016 學(xué)習(xí)鳥(niǎo). 頁(yè)面生成時(shí)間:3.520秒