1. 位置斷點(LOCATION BREAKPOINT)
在代碼中按F9設定一個位置斷點,然後按F5運作,是最常用的斷點方式,但是遇到如下代碼時,就十分頭疼了。
int test(void)
{
int i = 0, res = 99999999999;
for(i = 0; i < 999; i++)
{
int tmp = getValue(); // A行
res /= tmp; //B行
}
return res;
}
運作代碼,發現程式崩潰于B行,原因是tmp的值為0了,此時就需要在A行設定一個斷點,然後進入getValue函數内部中檢視運作狀态。由于斷點在循環體内,可能需狂按F5幾百次。使用位置斷點的斷點跳躍就可以大大減少體力勞動。
斷點跳躍----執行斷點但不在斷點處停止,直到執行完了一個特定的次數為止。在BREAK POINT框中,選中A行斷點,點選CONDITION,彈出圖1視窗,在“….SKIP BEFORE STOPPING“中輸入1000,按F5運作,當程式崩潰時,按CTRL+B打開BREAKPOINT框,發現此斷點後有:...100 times remaining,說明還剩下100次循環沒有執行,即程式在執行在900次循環時就挂掉了。按上述步驟,将斷點跳躍的值改為900,重新啟動程式,當循環到900次時,斷點就在A行啟動,可按F11進入getValue函數體中尋找傳回0的原因。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZwpmL2gTMx8lN0gDM1YTN1MTMvwlNx8CXyEjMxAjMvw1ckF2bsBXdvwFdl5mLuR2cj5Set1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
圖1
當知道程式在循環900次時挂掉,可以使用斷點條件表達式,即表達式為真時才觸發斷點。在”Enter the expression to be evaluated” 中輸入”i == 900”,并重新運作程式,效果跟上述一樣,斷點在i等于900時啟動。使用斷點條件表達式要注意不能包含任何函數和宏。
圖2
此外,斷點條件表達式與斷點跳躍可組合使用;BREAKPOINT框第二個編輯框中為要檢視的項目數量。
2. 資料斷點 (DATA BREAKPOINT)
在調試軟體的過程中,經常要對全局變量的變化過程進行追蹤,但是又不知道在哪裡設斷點。此時可以使用資料斷點。按CTRL+B打開BREAKPOINT視窗,選中DATA選項頁(如圖3),在第一個輸入框中輸入“MMI_fixed_matrix_menu.highlighted_row”,
圖3
當MMI_fixed_matrix_menu.highlighted_row的值發生改變時,就會彈出警告框(如圖4)并把程式停到改變該變量值的地方(如圖5)
圖4
圖5
若想知道變量是在何處被改為某個特定值,此時可将斷點條件改為“MMI_fixed_matrix_menu.highlighted_row == 0”,當條件滿足時,斷點啟動。
此外,還可以利用資料斷點跟蹤數組的越界導緻覆寫其他變量等十分棘手的問題。
3. 消息斷點(MESSAGE BREAKPOINT)
該斷點用得很少,且一般可以用上述兩種斷點替代。
4. 進階斷點
進階斷點的文法由兩部分組成:
(1)上下文(CONTEXT)-----即函數,源檔案,可執行檔案
(2) 變量,表達式或絕對位置
例如:在Main.c的第100行設一個位置斷點,而test1.dll和test2.dll都使用了該行,但隻想在test1.dll的調用中啟動斷點,具體用法如圖6