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的原因。
图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