壹、 設定變數變更中斷

假設一段程式,執行1000次隨機數,若隨機數為 100 之倍數,將 counter + 1 ,

這次要觀查的是 counter 之變化 (程式碼中之 sum) 。程式碼如下

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    int sum=0, i=0;
    srand( (unsigned) time(NULL));
    for(i=0; i<1000; i++){ /* break point here */
        if( rand() % 100==0) {
            sum = sum + 1;
        }
    }
    return 0;
}

 

監看式先設立 i, sum,觀查 i 與 sum 變化。

這支程式,我們只將焦點放在,當 sum 發生變化時,其 i 值為多少,這裡用到的是資料中斷點。

1. 偵錯 -> 新增中斷點 -> 新增資料中斷點

Watch_021.png  

 

或直接在下面之「中斷點」視窗裡面,按「新增」,「新增中斷點」

Watch_022.png  

 

2. 設立觀查變數位址值

注意到,位址那裡避免給 magic number,直接用 & 運算子方式,此處輸入 &sum,即取 sum 變數之位址值;另也需注意位元組計數問題。

Watch_023.png  

 

3. 好了之後按確定,在「中斷點」視窗中如下

Watch_024.png  

注意到第一個是我們設立的 &sum;而第二個是用 IDE 設立的中斷點。

 

4. 按下 F5 偵錯執行

接下來不需再逐步偵錯,直接按下 F5,當 sum 值發生變化時,將出現提示訊息

Watch_025.png  

 

5. 若不想再監看 sum 值時,直接到「中斷點」取消該選項即可。

Watch_026.png  

 

 


 

貮、設定函式中斷點 / 切換堆疊

有時,希望在執行某個函式時,才進行中斷,如以下程式碼

 

#include <stdio.h>

void func(int a)
{
    printf("func call at %d!!\n", a);
}

int main()
{
    int i;
    for(i=0; i<100; i++){ /* break point here */
        if(i%10==0) 
            func(i);
    }
    return 0;
}

 

這裡想要在每次執行 func 時,進行中斷,監看式先設變數 a 和變數 i,欲觀查當 i 為多少時,會呼叫 func 函式。

如下設定

1. 「偵錯」->「新增中斷點」->「在函式中斷」

Watch_027.png  

或直接切到中斷點視窗去,按下「新增」->「在函式中斷」。

Watch_028.png

 

2. 出現對話提示訊息,輸入函式名稱,此處為 func。

  Watch_029.png

 

3. 完成後,在中斷點視窗中如下圖

  Watch_030.png  

 

4. 再看程式編輯區,其實和用手動在編輯區按一下中斷點同樣效果。

Watch_031.png  

 

5. 按下 F5 執行後,發現 a=0,i 卻是亂數 (注意到 i 那裡有一個綠色圈圈的符號)

Watch_032.png  

 

再多按幾下也一樣。

Watch_032.png

Watch_033.png  

Watch_034.png

原因在於,當執行 func 時,在該函式之 scope 看不到主函式裡面的 i 。綠色圈圈的符號即代表,在目前的 scope 裡面,看不到該變數 (該變數存在於其他 function 中)

 

6. 「偵錯」->「視窗」->「呼叫堆疊」

Watch_035.png  

  

或 可直接在下面的視窗切到「呼叫堆疊」

Watch_036.png  

 

7. 查看堆疊視窗

Watch_037.png  

目前堆疊視窗顯示 VCTest.exe!func(int a=20),VCTest.exe 為應用程式名稱,目前執行到函式 func,且引數 a=20

 

8. 快點二下 VCTest.exe!main()

Watch_038.png  

上面的 a 變灰色 (外帶一個綠色圈圈符號),因在 main 裡面沒有變數 a;反而看得到在 main 裡之 i 值。

arrow
arrow
    全站熱搜

    edisonx 發表在 痞客邦 留言(0) 人氣()