壹、 設定變數變更中斷
假設一段程式,執行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. 偵錯 -> 新增中斷點 -> 新增資料中斷點
或直接在下面之「中斷點」視窗裡面,按「新增」,「新增中斷點」
2. 設立觀查變數位址值
注意到,位址那裡避免給 magic number,直接用 & 運算子方式,此處輸入 &sum,即取 sum 變數之位址值;另也需注意位元組計數問題。
3. 好了之後按確定,在「中斷點」視窗中如下
注意到第一個是我們設立的 &sum;而第二個是用 IDE 設立的中斷點。
4. 按下 F5 偵錯執行
接下來不需再逐步偵錯,直接按下 F5,當 sum 值發生變化時,將出現提示訊息
5. 若不想再監看 sum 值時,直接到「中斷點」取消該選項即可。
貮、設定函式中斷點 / 切換堆疊
有時,希望在執行某個函式時,才進行中斷,如以下程式碼
#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. 「偵錯」->「新增中斷點」->「在函式中斷」
或直接切到中斷點視窗去,按下「新增」->「在函式中斷」。
2. 出現對話提示訊息,輸入函式名稱,此處為 func。
3. 完成後,在中斷點視窗中如下圖
4. 再看程式編輯區,其實和用手動在編輯區按一下中斷點同樣效果。
5. 按下 F5 執行後,發現 a=0,i 卻是亂數 (注意到 i 那裡有一個綠色圈圈的符號)
再多按幾下也一樣。
原因在於,當執行 func 時,在該函式之 scope 看不到主函式裡面的 i 。綠色圈圈的符號即代表,在目前的 scope 裡面,看不到該變數 (該變數存在於其他 function 中)
6. 「偵錯」->「視窗」->「呼叫堆疊」
或 可直接在下面的視窗切到「呼叫堆疊」
7. 查看堆疊視窗
目前堆疊視窗顯示 VCTest.exe!func(int a=20),VCTest.exe 為應用程式名稱,目前執行到函式 func,且引數 a=20
8. 快點二下 VCTest.exe!main()
上面的 a 變灰色 (外帶一個綠色圈圈符號),因在 main 裡面沒有變數 a;反而看得到在 main 裡之 i 值。
留言列表