1. Visual studio断点调试

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int add(int a, int b)
{
int c = a + b;
return c;
}

int main()
{
int i = 0;
int val,t;

int* ans;
ans = (int*)malloc(sizeof(int) * 10);

for (i = 0; i < 10; i++) {
t = i * i;
val = add(t,i);
ans[i] = val;
}
return 0;
}

上面代码的功能是分别计算i从0到9时,计算
a5a4153dfe5021241f36a17f50325309.png

的值并存到ans数组里。

断点类型:

1. 指定变量条件

在t=i*i语句处设置条件断点——i>7
c3e900d95115dc1e12a5f01f3ef252e9.png
66b1f54ec37bf63c8e46c77fc99cd949.png

运行调试程序,程序在i=8时停了下来
cbf2c040bdd2c2adfe0514233311a70c.png

t是上一轮计算的7*7=49,调试程序直接停在了i=8的情况下。

2. 指定忽略次数

06bdc88fb4d1dd5f65ad6c1358354094.png

将刚才的断点设置为命中8次时调试程序暂停
27e87e6a3f92ed2390dd28fc06b49211.png

程序暂停时i=7(因为i=0,1,2,3,4,5,6,7)刚好时第8次命中断点,便暂停了程序

3. 数据断点

792098556eb1ad8b12313947cb5cbba1.png

cc547ddcc4faaad8465036e520ee49d6.png

当&ans[5]处的值发生修改时触发断点
88e00ec97328cf982c0e5539f8350949.png

运行程序,程序断点被触发,指令指针指向ans[i]=val一句的下一句。
fd8982c65b30442d404d8f6707d20dbf.png

此时i=5,ans[5]的值被赋值为30.

4. 查看堆栈信息

在add函数内设置断点
a6232e5f5c5af620437f341df2dbf9b9.png

查看堆栈,看到有两个栈信息,分别时main()和add()。当前位于add()
d0f6b391511cb513367f72df6ba29cc5.png

局部变量信息,只有add函数里的a,b,c
639d724c77535412168e246df5a4a822.png

点击main函数的栈,切换栈帧
30781dfd3b1924f7aad74d0941d4fa47.png

再看局部变量,可以看到main函数里的局部变量。
c9c216a42bf0376b88e460792e4a41cc.png

2. Eclipse

1. 指定变量条件

cadfbf150fa42895b4d9cada930d0c55.png

在t = i*i处设置条件断点,条件为i>7.

运行程序,程序在断点处暂停
f48795377b7e98c21cd6222b9e5e031e.png

6ffb18dfdd829cba8f1d8742de5c73a6.png

其局部变量i的值为8,第一次满足i>7的条件。

2. 忽略次数

3c889ec61b9ceb508a04f9c29574e648.png

设置断点属性的ignore count为8,意思时忽略8次断点命中,第九次暂停

运行程序,在断点处暂停
76053608c2833f1cd9fef8af0e807980.png

此时变量i的值为8,忽略了前8次(i=0,1,2,3,4,5,6,7)的情况。

3. 堆栈信息与局部变量

2642f8e116cbcadaba3073af4172ea3d.png

有add函数和main函数。

此时的局部变量信息
240d5f439412402446a711cbe107daa8.png

切换栈帧,双击main栈帧
1ad55a9cb511614003d644d0a5a89379.png

再看局部变量
6f23093925c4e8ba20d5d9085054f995.png

此时显示的是main里的局部变量

3. Gdb

1. 指定变量条件

在26行也就是t=i*i处设置条件断点,条件为i>7;继续运行程序
2f08a538f804dca43aabeb4304af2909.png

程序暂停在断点处,查看此时的变量i的值,发现i=8,刚满足i>7的断点条件

2. 指定忽略次数

a026201d83dd3e08818ba43650713947.png

在26行设置断点,查看断点信息,此时有一个位于main.c的26行的断点;设置断点忽略次数为8;运行程序。程序在t=i*i处暂停下来,查看变量i的值为8,意味这忽略了8次断点(分别为i=0,1,2,3,4,5,6,7)

3. 数据断点

在&ans[5]数据处设置数据断点
dd3e61da255ea2195a3b44201e9a7029.png

程序暂停在ans[i]=val语句的下一行,
60ca155bafa07610e6a733b29991797e.png

此时ans[5]的值已经被修改

4. 堆栈信息及局部变量

当函数执行到add函数里时,采用bt命令查看栈信息,有2个栈分别是main和add
549304c1ffaf97857b99cf40e6fc2a96.png

此时查看局部变量信息看到,c = 42.

切换栈帧frame 1.查看main的局部变量。
defb162acc53e442247893938baa1b3b.png

4. WinDbg

1. 指定变量条件

526f06672116b33bb10ee539fe06ee41.png

在t=i*i语句处设置断点,当i==8时触发断点
c06c0c5bd5fda536883702cff30842fd.png

df18cd26f515332b43ee15b17235d1d1.png

运行程序
d55092788271e2950fdee68d0cbe60ba.png

可以看到在debug程序的main函数的首地址+0x5e处暂停。

从局部变量信息里看到此时i=8.
174aec3bcae02326a44894a58f174f21.png

2. 设置忽略次数

bp debug!main+0x5e 7 表示忽略前6次,在第七次过断点时触发断点
1506790877966949f6b920dc0f7a46bc.png

运行程序,停于断点处。
d59e1cfd1738903e2c16b4a3c036b304.png

查看局部变量信息
ff8dbd76581ee62d40290c64445ca177.png

变量i = 6, 意思是前6次全部忽略(i=0,1,2,3,4,5),第七次过断点才触发。

3. 数据断点

在ans[1]处设置数据断点,需要先运行程序知道ans[1]的地址。

第一次断点,发现ans指向地址0x0000000000e46fb0处,所以32程序的ans[1]的地址为0x0000000000e46fb0

  • 0x4, 在此设置数据断点

ba r4 0x0000000000e46fb0+0x4
3fea893ef8cabdf99eae7dca401a38c6.png

773039efc68d08a20070c7bfa7d9d83a.png

执行ans[i]=val前的监视变量
f09f159bd961c656cc974ffb78bfbd3d.png

Next step
188e972b75853a0441d54edaf4e42688.png

Ans[1]的值被更新。

4. 堆栈信息及局部变量

在add函数内设置断点,程序执行至add函数内断点处
a0556574d146371d3ec87aed72d51cfb.png

查看堆栈信息
437e92f9544f98e30bdb12f1a5d5c745.png

查看局部变量,仅有add函数内的变量
99364d9ecff7eeff25ccf37af03eeb48.png

.frame切换栈帧,查看局部变量,可以看到main内的函数,且当前栈帧为main
f01b63d0e251bdcd85ba27c7410173e9.png

× 请我吃糖~
打赏二维码