1. Visual studio断点调试
测试代码:
1 | int add(int a, int b) |
上面代码的功能是分别计算i从0到9时,计算
的值并存到ans数组里。
断点类型:
1. 指定变量条件
在t=i*i语句处设置条件断点——i>7
运行调试程序,程序在i=8时停了下来
t是上一轮计算的7*7=49,调试程序直接停在了i=8的情况下。
2. 指定忽略次数
将刚才的断点设置为命中8次时调试程序暂停
程序暂停时i=7(因为i=0,1,2,3,4,5,6,7)刚好时第8次命中断点,便暂停了程序
3. 数据断点
当&ans[5]处的值发生修改时触发断点
运行程序,程序断点被触发,指令指针指向ans[i]=val一句的下一句。
此时i=5,ans[5]的值被赋值为30.
4. 查看堆栈信息
在add函数内设置断点
查看堆栈,看到有两个栈信息,分别时main()和add()。当前位于add()
局部变量信息,只有add函数里的a,b,c
点击main函数的栈,切换栈帧
再看局部变量,可以看到main函数里的局部变量。
2. Eclipse
1. 指定变量条件
在t = i*i处设置条件断点,条件为i>7.
运行程序,程序在断点处暂停
其局部变量i的值为8,第一次满足i>7的条件。
2. 忽略次数
设置断点属性的ignore count为8,意思时忽略8次断点命中,第九次暂停
运行程序,在断点处暂停
此时变量i的值为8,忽略了前8次(i=0,1,2,3,4,5,6,7)的情况。
3. 堆栈信息与局部变量
有add函数和main函数。
此时的局部变量信息
切换栈帧,双击main栈帧
再看局部变量
此时显示的是main里的局部变量
3. Gdb
1. 指定变量条件
在26行也就是t=i*i处设置条件断点,条件为i>7;继续运行程序
程序暂停在断点处,查看此时的变量i的值,发现i=8,刚满足i>7的断点条件
2. 指定忽略次数
在26行设置断点,查看断点信息,此时有一个位于main.c的26行的断点;设置断点忽略次数为8;运行程序。程序在t=i*i处暂停下来,查看变量i的值为8,意味这忽略了8次断点(分别为i=0,1,2,3,4,5,6,7)
3. 数据断点
在&ans[5]数据处设置数据断点
程序暂停在ans[i]=val语句的下一行,
此时ans[5]的值已经被修改
4. 堆栈信息及局部变量
当函数执行到add函数里时,采用bt命令查看栈信息,有2个栈分别是main和add
此时查看局部变量信息看到,c = 42.
切换栈帧frame 1.查看main的局部变量。
4. WinDbg
1. 指定变量条件
在t=i*i语句处设置断点,当i==8时触发断点
运行程序
可以看到在debug程序的main函数的首地址+0x5e处暂停。
从局部变量信息里看到此时i=8.
2. 设置忽略次数
bp debug!main+0x5e 7 表示忽略前6次,在第七次过断点时触发断点
运行程序,停于断点处。
查看局部变量信息
变量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
执行ans[i]=val前的监视变量
Next step
Ans[1]的值被更新。
4. 堆栈信息及局部变量
在add函数内设置断点,程序执行至add函数内断点处
查看堆栈信息
查看局部变量,仅有add函数内的变量
.frame切换栈帧,查看局部变量,可以看到main内的函数,且当前栈帧为main
最后更新: 2022年09月29日 19:37
原始链接: https://yang-xiaofeng1101.github.io/2020/06/16/%E6%96%AD%E7%82%B9%E8%B0%83%E8%AF%95/