菜單命令 | 快捷鍵 | 功能 |
---|---|---|
Go | F5 | 開始或繼續調試程序,到某個斷點,程序的結束或需要用戶輸入的地方停止 |
Restart | Ctrl+Shift+F5 | 重新開始執行程序,並處於調試狀態 |
Stop Debugging | Shift+F5 | 終止程序的調試,放回到程序編輯的狀態 |
Break | 在當前位置暫停程序的執行 | |
Step Into | F11 | 單步執行程序的每一個指令,能進入被調用的函數內部 |
Step Over | F10 | 單步執行,當遇到一個函數的調用時,該函數被執行,單並不進入該函數內部 |
Step Out | Shift+F10 |
運行到當前函數調用返回後的第一條語句; 使用這個命令能在已確定錯誤不在當前函數中時,快速地執行完此函數 |
Run to Cursor | Ctrl+F10 | 程序執行到當前光標處,相當於在光標處臨時設置了一個端點 |
Step Into Specific Function | 執行程序的每一步,並進入指定的函數調用,這個命令可以跟蹤任意多的嵌套函數 |
variable (變量)窗口
context (上下文)下拉框:在這裏選擇想要查看的函數,然後 Debug 會在窗口顯示函數局部變量的當前值。該窗口有 3 個選項卡。
- Auto 選項卡中顯示當前語句或前一條語句中變量的值和函數的返回值。
- Locals 選項卡中顯示當前函數局部變量的名稱、值和類型。
- this 選項卡以樹型方式顯示當前類對象的所有數據成員,單擊“+”號可展開 this 指針所指對象。
Watch 窗口用於觀察和修改變量或表達式的值。它有 Watch1、Watch2、Watch3 和 Watch4 等 4 個選項卡,在每個選項卡中,用戶都必須手工設置要觀察的變量或表達式。
MFC 調試宏
爲了快速查找程序設計中的錯誤,MFC 提供了一些跟蹤和斷言宏,其中常用的有 TRACE()、ASSERT()、ASSERT_VALID()等。
1.TRACE()宏
TRACE()宏在調試窗口輸出變量數值,它採用類似於 printf()函數和 CString::Format()成員函數的字符串格式化語法,在 TRACE()宏中,可以使用各種 MFC 類。例如
int m_age = 23;
CString m_name("yiding");
TRACE("Name = %s, Age = %d\n", m_name, m_age);
調試窗口輸出下列語句並換行
Name = yiding, Age =23
2.ASSERT()宏
ASSERT()宏語法如下:
ASSER(<條件表達式>);
如果條件表達式爲真,則程序繼續執行;如果爲假,則在該語句處終止程序運行,並彈出一個對話框,顯示程序終止的行及所在文件信息下面一段代碼展示瞭如何使用 ASSERT()宏來校驗傳遞進來的參數。
void test(char* p, int size)
{
ASSERT(p != 0); //判斷是否提供了緩衝區
ASSERT(size >= 100); //判斷緩衝區是否大於 100
//繼續執行
}
3.ASSERT_VALID()
ASSERT_VALID()宏語法如下:
ASSERT_VALID(<指針>);
ASSERT_VALID()紅用於檢查指針和對象的有效性,對於一般指針,只檢查指針是否爲空。對於 MFC 指針,還需調用CObject::AssertValid()成員函數,判斷對象合法性。ASSERT_VALID()宏提示指針和對象無效的方式與 ASSERT()宏一樣,使用提示對話框輸出錯誤信息。
ASSERT_VALID()宏對於 CObject 派生類的校驗更爲簡單。例如:
void CMView::test(CYView* pView) //CMView 和 CYView 是 CObject 的派生類
{
ASSERT_VALID(this);
ASSERT_VALID(pView);
//繼續執行
}
4.Dump()調試函數
Dump()函數是 CObject 類的一個成員函數,調用該函數可以輸出對象內部數據成員的值。當程序調試過程中希望檢查對象內部狀態時,該函數是非常有用的。Dump()函數使用“<<”插入操作符輸出數據成員值。例如:
void CAge::Dump(CDumpContext &dc) const
{
CObject::Dump(dc);
dc << "Age =" << m_ages;
}