1. 程式人生 > >在除錯MFC程式中檢視變數的方法(包含控制檯)

在除錯MFC程式中檢視變數的方法(包含控制檯)

在除錯MFC程式時,我們經常需要檢視特定位置變數的輸出值。或者在某特定條件執行時,給出一個輸出標識。

一般來說,有3種方法:

1)呼叫TRACE(LPCTSTR lpszFormat, ...)函式

   在MFC中使用TRACE函式來列印輸出結果卻是非常方便,和在控制檯程式中使用printf函式的使用方法和效果類似。不過有幾點  

   需要注意:一,TRACE函式的輸出是在Output視窗的Debug選項下;二,只有在DEBUG版本除錯時才會有輸出,如果是在

   Release版本除錯或者執行程式時,將不會看到輸出。

========================================================================================================

1.在MFC中加入TRACE語句

2.在TOOLS->MFC TRACER中選擇 “ENABLE TRACING”點選OK

3.進行除錯執行,GO(F5)(特別注意:不是執行‘!’以前之所以不能看到TRACE內容,是因為不是除錯執行,而是‘!’了,切記,切記)

4.然後就會在OUTPUT中的DEBUG視窗中看到TRACE內容了,除錯執行會自動從BUILD視窗跳到DEBUG視窗,在那裡就看到TRACE的內容了,^_^

以下是找的TRACE的詳細介紹:

 ================================================================================================

      TRACE巨集對於VC下程式除錯來說是很有用的東西,有著類似printf的功能;該巨集僅僅在程式的DEBUG版本中出現,當RELEASE的時候該巨集就完全訊息了,從而幫助你調式也在RELEASE的時候減少程式碼量。

使用非常簡單,格式如下:

TRACE("DDDDDDDDDDD");

TRACE("wewe%d",333);

同樣還存在TRACE0,TRACE1,TRACE2。。。分別對應0,1,2。。個引數

TRACE資訊輸出到VCIDE環境的輸出視窗(該視窗是你編譯專案出錯提示的哪個視窗),但僅限於你在VC中執行你的DEBUG版本的程式。

TRACE資訊還可以使用DEBUGVIEW來捕獲到。這種情況下,你不能在VC的IDE環境中執行你的程式,而將BUILD好的DEBUG版本的程式單獨執行,這個時候可以在DEBUGVIEW的視窗看到DEBUGVIE格式的輸出了。

VC中TRACE的用法有以下四種:

1:

TRACE  ,就是不帶動態引數輸出字串,  類似C的printf("輸出字串"); 
    
2:

TRACE  中的字串可以帶一個引數輸出   ,類似C的printf("...%d",變數);

3:

TRACE  可以帶兩個引數輸出,類似C的printf("...%d...%f",變數1,變數2);

4:

TRACE 可以帶三個引數輸出,類似C的printf("...%d,%d,%d",變數1,變數2,變數3);

TRACE巨集有點象我們以前在C語言中用的Printf函式,使程式在執行過程中輸出一些除錯資訊,使我們能瞭解程式的一些狀態。但有一點不同的是:


TRACE 巨集只有在除錯狀態下才有所輸出,而以前用的Printf 函式在任何情況下都有輸出。和Printf函式一樣,TRACE函式可以接受多個引數如:

int x = 1;
int y = 16;
float z = 32.0;
TRACE( "This is a TRACE statement\n" );
TRACE( "The value of x is %d\n", x );
TRACE( "x = %d and y = %d\n", x, y );
TRACE( "x = %d and y = %x and z = %f\n", x, y, z );

要注意的是TRACE巨集只對Debug 版本的工程產生作用,在Release 版本的工程中,TRACE巨集將被忽略。

========================================================================================================

2)使用AfxMessageBox()函式來輸出資訊

    這個函式在除錯時也比較常用,使用方法簡單,此處就不做介紹。

==================================================================================================================

以下簡述MessageBox與AfxMessageBox之間的區別。

1、AfxMessageBox()函式在任何類裡邊都可以使用,而MessageBox()函式只能在CWnd類的繼承類中使用。

2、AfxMessageBox()函式的引數沒有MessageBox()函式的引數豐富,所以後者較前者靈活。

3、AfxMessageBox不能控制訊息框標題,常用於除錯程式時的內部資料輸出或警告;MessageBox比較正式,常用在要提交的應用程式版本中,可以控制標題內容而不必採用含義不明的可執行檔名為標題。

int iRes =MessageBox("你看見訊息框了嗎?","測試",MB_YESNO|MB_ICONWARNING);

if( iRes == IDYES )

MessageBox("看見了!");


AfxMessageBox的用法

int AfxMessageBox(

   LPCTSTR lpszText,

   UINT nType = MB_OK, //預設為0

   UINT nIDHelp = 0

);


字串的型別是  LPCTSTR 。

解決辦法1: 將第4行改為:if(AfxMessageBox(_T("是否真的要退出當前程式?"),MB_YESNO)==IDYES)

解決辦法2:選擇“專案”選單->專案屬性->配置屬性->常規->字符集,改為“未設定”即可。

我覺得我們還是儘量使用方法1來解決這個問題!


也就說字串前面加上_T 就可以將你的字串變為長位元組型別了。。。。

LPCTSTR型別:

  L表示long指標這是為了相容Windows 3.1等16位作業系統遺留下來的,在win32中以及其他的32位作業系統中,long指標和near指標及far修飾符都是為了相容的作用。沒有實際意義。   P表示這是一個指標   C表示是一個常量   T表示在Win32環境中,有一個_T巨集   STR表示這個變數是一個字串

這個巨集用來表示你的字元是否使用UNICODE,如果你的程式定義了UNICODE或者其他相關的巨集,那麼這個字元或者字串將被作為UNICODE字串,否則就是標準的ANSI字串。

  所以LPCTSTR就表示一個指向常固定地址的可以根據一些巨集定義改變語義的字串。

LPCTSTR ==const TCHAR *

CString 和 LPCTSTR可以說通用。原因在於CString定義的自動型別轉換,沒什麼奇特的,最簡單的C++操作符過載而已。

LPSTR lpstr =(LPSTR)(LPCTSTR)string;  

char buf[20];

AfxMessageBox(CString(buf),0,0);

========================================================================================================

3)將標準輸出定向到自己建立的控制檯

     #include "io.h"
     #include "fcntl.h"

    在該檔案的'CXXXApp theApp;'後面增加一個函式:

       void InitConsole()
     {
           int nRet= 0;
          FILE* fp;
          AllocConsole();
          nRet=_open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE),_O_TEXT);
          fp = _fdopen(nRet, "w");
         *stdout = *fp;
         setvbuf(stdout, NULL, _IONBF, 0);
    }

 將此函式在MFC程式初始化的地方(函式'BOOL CXXXApp::InitInstance()中的所有程式碼前面)呼叫,即可使用控制檯檢視printf函式的列印資訊