C語言Debug和Release的介紹

2021-08-17 23:13:17 字數 1002 閱讀 3869

一、定義

(1)debug通常稱為除錯版本,它包含除錯資訊,並且不作任何優化,便於程式設計師除錯程式。

(2)release稱為發布版本,它往往是進行了各種優化,使得程式在**大小和執行速度上都是最優的,以便使用者很好的使用二、debug和release區別

debug包含除錯資訊,不做任何優化。而release不包含除錯資訊,做了各種優化。(相比debug同一程式它的內從較小)

見下圖:

三、來看下面一段程式

#define _crt_secure_no_warnings 1

#include#includeint main()

; for (i = 0; i <= 12; i++) //至少<=12

system("pause");

return 0;

}

在debug環境下,上面程式是輸出死迴圈hehe,而在release環境下輸出13個hehe。

why???

因為變數i和陣列arr都是區域性變數定義在棧區,而棧區給變數分配記憶體是先使用高位址在使用低位址。所以i在高位址,arr在低位址,在vs2013編譯環境中,兩者分配記憶體之間保留兩個空間(linux中保留乙個,vc6.0乙個也會死迴圈)。所以當i越界訪問時,

&i和&arr[12]的位址一樣,所以進行到i= 12時,i又重新等於0,所以造成了死迴圈。解決方法即是把陣列建立放到變數i建立之前。

#define _crt_secure_no_warnings 1

#include#includeint main()

; int i = 0;

for (i = 0; i <= 12; i++)

system("pause");

return 0;

}

由於release存在優化,所以自動把兩者交換,所以不會死迴圈。最終結果輸出13個hehe。

所以說除錯就是在debug版本的環境中找**中潛伏的問題的乙個過程。

vc中debug版程式正常但release版崩潰

i.記憶體分配問題 1.變數未初始化。為debug中會自動給變數初始化found false,而在release版中 則不會。所以盡可能的給變數 類或結構初始化。2.資料溢位的問題 如 char buffer 10 int counter lstrcpy buffer,abcdefghik 在deb...

巧用 C語言 斷言機制助力程式debug

斷言可以對在系統中隱藏很深,用其它手段極難發現的問題進行定位,並且輸出資訊很詳細,可以很好地解決大多數c語言編譯器錯誤資訊輸出不詳細的問題。斷言是對某種條件進行檢測,若條件成立則無反應,否則程式執行到斷言處終止,同時輸出為成立的條件。assert是乙個巨集定義,並不是函式。如 include ass...

Debug格式化輸出 基於C語言

舉例 include define echo color none 033 0 0m define echo color green 033 0 32m define debug fmt,args.printf echo color green debug fmt file s,func s,lin...