怎麼看調試過程的程序編譯
⑴ c語言中什麼叫做單步調試,步驟是什麼
單步調試是指程序開發中,為了找到程序的bug,通常採用的一種調試手段,一步一步跟蹤程序執行的流程,根據變數的值,找到錯誤的原因。
解決這個問題的方法如下:
1、首先需要設置斷點的那一行代碼的最前面點擊下,就會出現一個紅色的圓球,代表設置斷點成功,下圖一共設置了4個斷點。
⑵ 這個程序在DEV C++上可以運行並出現正確結果 但是提交到PTA就會報錯!請賜教!
當 C 語言程序能夠正常編譯並運行,但可能結果可疑或不對時,即,當程序沒有語法錯誤而可能有邏輯錯誤時,就需要考慮使用調試Debug功能來找出程序的 bug。
在調試過程中,可以讓程序運行到設置好的斷點處並暫停下來,然後通過觀察相關的變數值是否正確,來判斷程序的邏輯錯誤可能出現在哪裡。
本文以 Dev-C++ 5.11 開發環境為例來說明 C 語言的調試方法。
准備工作
設置斷點
開始調試
添加查看
繼續或停止調試
菜單:工具/編譯選項
Tools/Compiler Options
在「設定編譯器配置」Compiler set to configure中選擇「TDM-GCC 4.9.2 64-bit Debug」。
提示:
如果是 32 位的系統,請選擇「TDM-GCC 4.9.2 32-bit Debug」。
在下方的「編譯器」General選項卡中,勾選「編譯時加入以下命令:」Add the following commands when calling the compiler:,並在其中輸入「-g」。如上圖所示。
確定退出後,可在軟體界面右上角看到或選擇用於調試的編譯器。
斷點breakpoint,指的是在調試過程中程序運行到此行代碼前會臨時停下,以便觀察此時的某些變數值。
可通過點擊代碼左側的行號來設置斷點。
或在某行代碼上右擊,選擇「切換斷點」Toggle Breakpoint。
或者使用快捷鍵:F4。
同樣的方法也可用於取消斷點設置。
斷點設置建議:
設置在 scanf 等輸入語句的下一行,以觀察數據是否被正確獲得。
設置在循環語句的下一行,以觀察循環控制變數在循環結束後的值,或者為了避免調試過程中在循環語句段反復點擊「下一步」按鈕。
設置在函數調用語句的下一行,以觀察函數返回的結果值是否正確。
在開始調試前,一般要先編譯。
菜單:運行/編譯
Execute/Compile
快捷鍵:F9
確保沒有語法錯誤之後,再開始調試。
菜單:運行/調試。
Execute/Debug
快捷鍵:F5
或者,點擊工具欄上的「」按鈕。
開始調試後,代碼將按照常規順序依次運行。執行到第一個斷點時,才臨時停止,紅色行變成藍色行,代表即將要執行的代碼行。
此時,可將滑鼠指針懸浮於某個變數之上,以查看此時該變數的值。
提示:
對於字元變數,會同時顯示字元的 ASCII 碼值。
或者,在變數上右擊,選擇「添加查看」Add watch,會自動將此變數添加到左側的調試Debug面板中,以便後續跟蹤查看。
提示:
在變數名上雙擊,可精準選中變數。
或者,點擊左下方的「添加查看」Add watch按鈕,手動添加要查看的變數。
可以使用相關按鈕繼續調試工作。
下一步Next line按鈕
運行下一行代碼。如果下一行代碼是對函數的調用,不進入函數體。
快捷鍵:F7
類似於 Turbo C++ 中的「Step Over」。
跳過Continue按鈕
直接運行到下一個斷點處。
單步進入Into function按鈕
運行下一行代碼,如果下一行是對函數的調用,則進入函數體內逐行運行。
快捷鍵:F8
類似於 Turbo C++ 中的「Trace」。
跳過函數Skip function按鈕
當在函數內部時點擊此按鈕,將直接運行到函數結束,並返回到函數調用處。
停止執行Stop Execution按鈕
停止調試,清除所有添加好的查看watch。
快捷鍵:F6
說明:
下一條語句Next instruction按鈕和進入語句Into instruction按鈕,常結合CPU窗口查看並執行指令。一般的調試工作中可以不用。
⑶ 編譯和調試的區別
編譯和調試都是寫程序的重要環節。它們兩者有什麼區別呢?下面,我跟大家分享一下編譯和調試的區別。
1.編譯和調試的區別
編譯是編譯器在你程序沒有運行的時候幫你檢查錯誤。
調試是你用調試器在程序運行以後,根據運行狀況來檢查錯誤。
這兩者的不可逆的,首先得編譯通過,你才能調試啊,編譯正確後,會生成exe文件,IDE中啟動程序,可以進行調試。
編譯是把源代碼變成二進制obj的過程(鏈接後成為可執行文件),當然會先幫你檢查有無簡單的語法問題,要不編譯器人家不認識,你自己說的有無邏輯就和編譯器無關了。
調試首先需要生成二進制代碼,所以需要首先進行編譯和鏈接,然後到斷點後,調試器會幫你加int 3中斷,就停住了。
編譯關注語法錯誤,調試關注邏輯錯誤。也就是說編譯關注的是syntax(語法)方面的問題,調式關注的是semantics(語義)方面的問題。
2.編譯詞法分析
詞法分析的任務是對由字元組成的單詞進行處理,從左至右逐個字元地對源程序進行掃描,產生一個個的單詞符號,把作為字元串的源程序改造成為單詞符號串的中間程序。執行詞法分析的程序稱為詞法分析程序或掃描器。
源程序中的單詞符號經掃描器分析,一般產生二元式:單詞種別;單詞自身的值。單詞種別通常用整數編碼,如果一個種別只含一個單詞符號,那麼對這個單詞符號,種別編碼就完全代表它自身的值了。若一個種別含有許多個單詞符號,那麼,對於它的每個單詞符號,除了給出種別編碼以外,還應給出自身的值。
詞法分析器一般來說有兩種方法構造:手工構造和自動生成。手工構造可使用狀態圖進行工作,自動生成使用確定的有限自動機來實現。
3.編譯語法分析
編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語法單位,如表達式、賦值、循環等,最後看是否構成一個符合要求的程序,按該語言使用的語法規則分析檢查每條語句是否有正確的邏輯結構,程序是最終的一個語法單位。編譯程序的語法規則可用上下文無關文法來刻畫。
語法分析的方法分為兩種:自上而下分析法和自下而上分析法。自上而下就是從文法的開始符號出發,向下推導,推出句子。而自下而上分析法採用的是移進歸約法,基本思想是:用一個寄存符號的先進後出棧,把輸入符號一個一個地移進棧里,當棧頂形成某個產生式的一個候選式時,即把棧頂的這一部分歸約成該產生式的左鄰符號。
4.代碼優化
代碼優化是指對程序進行多種等價變換,使得從變換後的程序出發,能生成更有效的目標代碼。所謂等價,是指不改變程序的運行結果。所謂有效,主要指目標代碼運行時間較短,以及佔用的存儲空間較小。這種變換稱為優化。
有兩類優化:一類是對語法分析後的中間代碼進行優化,它不依賴於具體的計算機;另一類是在生成目標代碼時進行的,它在很大程度上依賴於具體的計算機。對於前一類優化,根據它所涉及的程序范圍可分為局部優化、循環優化和全局優化三個不同的級別。
4.編譯出錯處理
如果編譯過程中發現源程序有錯誤,編譯程序應報告錯誤的性質和錯誤的發生的地點,並且將錯誤所造成的影響限制在盡可能小的范圍內,使得源程序的其餘部分能繼續被編譯下去,有些編譯程序還能自動糾正錯誤,這些工作由錯誤處理程序完成。
需要注意的是,一般上編譯器只做語法檢查和最簡單的語義檢查,而不檢查程序的邏輯。邏輯錯誤要通過調試。
我總結:
看完了上面的比較,你現在還能區別編譯與調試嗎?其實,只要記住這句話:“編譯關注語法錯誤,調試關注邏輯錯誤,先有編譯,後有調試”,就不會忘了兩者的區別了。
⑷ 如何查看C程序編譯後生成的匯編語言啊
VC++編譯器,在按F10後,調試工具欄的最後一個,點選它後,會出現一個窗口,裡面的就是程序的匯編語言。
⑸ C語言 怎麼調試程序
一、在keil中調試c語言程序
1、打開我們的程序,點擊菜單欄右側的start/stopdebug..按鈕,進入調試模式,如下圖。
⑹ c++編譯器怎樣查看運行過程
你先寫好你的程序,在工具欄的空白處右鍵,選擇調試,就會出現一個調試工具,那上面的就是可以查看一步一步運行的過程路徑,f11是快捷鍵。你慢慢研究,很好用的。給你張圖!