您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關c++代碼調試的小技巧的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
1.代碼調試的重要性
代碼調試在程序開發階段占有舉足輕重的地位,可見代碼調試的重要性。但是有一點必須強調:程序是設計出來的,而不是調試出來的。這是所有程序員必須牢記在心的一條準則。一個沒有設計或者這幾得很糟糕的程序,無論怎樣調試,也不會成為一個合格的程序。
程序有著良好的設計的前提下,軟件開發的過程中,編碼錯誤在所難免。所有程序可能出現的錯誤可分為兩類:語法錯誤和邏輯錯誤。調試通常是指在消除了語法錯誤之后,發現程序中的邏輯錯誤的過程。對C/C++程序進行調試,有這樣集中常用的手段。它們既可以單獨使用,也可以配合使用。
2. 代碼調試方式的幾點建議
2.1使用打印語句
這是最樸素,也是最直接的方法。程序的運行可以看成是一組變量(狀態)不斷變化的過程,這個過程就是數據處理的過程。如果程序的最終結果不對,那么我們必須考慮這一組狀態什么時候出現了問題,而查看中間結果就成了一種最有效的手段。
因此,不要過分迷信功能強大的調試工具。在大部分情況下,程序出現的問題都是一些小問題。而正是這些小問題,卻造成了大麻煩。程序員可以通過對最有可能出錯的代碼附近使用簡單的printf()語句或cout<<…語句來輸出中間結果,查看異常情況。
2.2使用調試標記
在調試程序的時候使用相應的輔助代碼(如輸出中間結果等),在調試完成之后隱藏這些代碼,是一種常用的調試策略。
這種策略可以借助于#define、#ifdef、#endif這三個與編譯指令來實現。具體地說,就是在調試程序的時候,利用編譯器的命令行參數定義調試標記(相當于程序中用#define定義的宏),然后再#ifdef和#endif之間包含相應的調試代碼就可以了。當程序最終調試完成后,在生成發行版時,只要在編譯器命令行參數中不再提供調試標記,程序中的調試代碼就會消失。常用的調試標記為_DEBUG(在VC++ 2012)中,編譯器調試版的程序是會缺省定義宏_DEBUG。考察如下程序。
#include <iostream> using namespace std; int main() { int i=5; #ifdef _DEBUG cout<<i<<endl; #endif cout<<"Hello World!"<<endl; }
在調試程序的時候,會執行#ifdef和#endif之間的語句。當調試完成之后,由于調試標記_DEBUG失去定義,從而隱藏調試代碼。
2.3使用調試變量
與使用調試標記的方法類似,可以在運行時設置一個供調試用的bool型變量,它的值決定了特定調試代碼的開放和關閉。并且可以通過程序的命令行參數來控制該變量的開關。上面的程序經過修改如下。
#include <iostream> #include <string> using namespace std; bool debug; int main(int argc,char* argv[]) { int i=5; for(int j=0;j<argc;++j) { if(string(argv[j])=="debug=on") { debug=true; } } if(debug) { cout<<i<<endl; } cout<<"Hello World!"<<endl; }
程序通過命令行啟動時,只要在命令行參數中指明debug=on,就可以輸出調試信息。否則,只是輸出程序“正常”運行的部分。這樣就具有較高的靈活性。
2.4使用內置的調試宏
在程序調試的過程中,經常希望知道當前運行的是哪個模塊小的哪個函數,在源文件中是第幾行等等。如果手工添加這些信息,無疑會給程序員帶來很大的負擔。因此,C++提供了幾個宏,他們分別是__FILE__
、__FUNCTION__
和__LINE__
,可以利用它們“自動“獲取有關模塊、函數和行的信息。考察如下程序。
#include <iostream> using namespace std; void func1() { cout<<__FILE__<<endl; } void func2() { cout<<__FUNCTION__<<endl; } void func3() { cout<<__LINE__<<endl; } int main(int argc,char* argv[]) { func1(); func2(); func3(); }
在本人的機器上輸出如下信息:
e:\lvlv_study\synchronousfile\school\2015.10.23\programming\debug\main.cpp
func2
13
另外還可以使用assert()宏來進行斷言。assert是一個只在調試版本下起作用的宏。另外,用戶也可以定義自己的宏輔助來完成調試任務。例如下面的紅可以用來顯示變量的值,而且變量的名字會一同顯示出來:
#define PR(x) cout<<#x”=”<<x;
這是利用#對宏的參數進行字符串化的處理。
2.5利用調試工具進行調試
利用集成開發環境進行調試也是一種攢則。可以在IDE中設置斷點、但不調試、產看變量的內存的值、動態修改變量的值以改變程序的執行路徑等。每一種具體的調試工具,其調試命令和方法都有差異,使用時要參閱相應的文檔(如MSDN等)。
要說明的一點是,使用工具進行調試與基于打印輸出的調試除了在使用的方便程度上有所差異外,在某些特殊的情況下,不能活著很難用工具進行某些程序的調試。如在Windows程序設計中,要調試與窗口重繪的有關代碼,就不適合用IDE進行調試。原因是焦點從IDE窗口轉到應用程序的窗口時,會引發新的重繪動作,導致程序運行陷入“死循環“。Linux環境下,進行代碼的調試,我們可以借助于強大的調試工具gdb,其可以快速的定位到程序出錯的位置,如使用bt或where命令可以快速找到程序出現core dumped的位置。
3.
使用各種調試的手段或工具,其目的是盡早的發現已經存在于程序中的錯誤。與此相關聯的問題是,如何較少的引入錯誤、如何有策略地使用調試手段。給出幾條如下建議。
(1)采用良好的變成風格。比如,用統一的規范為變量、函數和類型命名。程序的基本單位(如函數)的規模控制在一定范圍之內(如100行),鋸齒形編碼,合理的注釋等等。
(2)進行代碼復查。這是Watts S Humphery領導的研究小組指定的PSP(Personal Software Process,即個人軟件過程)規范中提倡的做法。在編譯之前就進行代碼復查,比直接進行編譯更能有效地發現程序缺陷。
(3)對歷史數據進行統計和跟蹤。每個程序員的只是背景和工作習慣各不相同,通過統計歷史上個人最容易出現哪些類型的編程錯誤,以便在將來有針對性地排查,是一種有效的提程序質量的做法。
感謝各位的閱讀!關于c++代碼調試的小技巧就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。