【转自】http://blog.csdn.net/ghttzsqgm/article/details/5326894
http://blog.csdn.net/cadcisdhht/article/details/5649681
下面有从浅入深的4个问题,您可以尝试回答一下
1. 一个如下的语句for (int i = 0; i < 10; i++){if (i == 5)j = 5;},什么都写在一行,你怎么在j=5前面插入断点
2. 在一个1000次的循环体内部设置断点,你希望当循环进行到900次后中断,怎么才能做到呢?
3. 你有一个表达式在上面循环的某一次发生了变化,你想知道是哪一次,在哪个地方,怎么才能做到?
4. 你希望你的断点在被命中100次后,每命中三次中断一次,比如第103,第106,第109怎样做?
问题1,2
这两个问题最简单,我在一个例子里说明
例如如下循环
for(int i=0;i<1000;i++){doSomeThing......}
在循环的大括号上单击右键,插入断点,用这个方法,可以对付那些喜欢把语句写在一行上的家伙,其实,随着.Net3.5中Linq的出现,我们肯定也会经常在在一行上写复杂的表达式,这个时候用这种插入方法会比较管用 (???总么不管用?)
ok,现在我们来编辑这个断点的条件,在断点上右键单击,选择如图菜单项
在弹出的窗口中可以设置断点命中的条件i==900
注意我是在调试C#代码,默认的条件语句语法是C#,如果你想切换,那就需要用Ctrl-B,来插入断点,并在弹出窗口中选择语言
通过这样设置条件断点,我们就可以解决我们的问题1,2了
有些时候,我们需要根据字符串的内容来添加断点。比如我们在调试如下代码:
void CVSDebugTricksDlg::OnBnClickedButton1()
{
char* string;
for(int i = 0; i < 5; ++i) {
string = GetString(i);
TRACE(string);
}
}
char* CVSDebugTricksDlg::GetString(int number)
{
switch (number) {
case 0:
return "Zero";
case 1:
return "One";
case 2:
return "Two";
default:
return "Other";
}
}
我们希望当运行到Trace(string)时,如果字符串string为”Two”时能中断运行。如果我们和根据数值添加断点一样的方法,添加如下断点:
当我们运行上述代码时,会发现即使string的内容”Two”时,运行并没有中断。这是因为==运算符比较的是两个字符串的地址而不是内容,因此上述断点并不能满足我们的需求。
Visual Studio考虑到程序员经常会根据字符串的内容添加断点,因此在添加断点这个功能上为字符串做了特殊的支持。我们在根据字符串内容添加断点时,可以使用strcmp等函数来设置断点。
于是在上述示例中,我们可以用strcmp函数来添加如下断点:
strcmp(string, "Two") == 0
问题3
同样通过设置条件断点我们还可以解决我们的问题3,对表达式变化的跟踪
string user="yizhu2000"
for(int i=0;i<10000;i++){
DoSomething1()
.......
DoSomethingN()
}
当循环执行完毕时我们发现user变成了"smart_boy",你不知道这个值是在第几次循环的时候变化的,那么你是不是会选择打上断点,一次一次中断,来查看呢?当然不用
在循环体结束的位置我们设置一个断点,打开条件编辑窗口(打开方法同上),设置表达式为user,勾选下面的HasChanged,也就是说,你告诉断点,当user的值发生变化时才触发(注意:第一次执行到断点的时候,程序一定会中断,并计算这时表达式的值,所以,所谓发生变化,指的是以后执行到断点是表达式的值和第一次执行到断点时表达式的值的比较)
问题4
如何让断点在指定的命中次数或者大于某个次数时触发呢?方法是设定几个断点的HitCount,右键单击断点,在弹出菜单中选择Hit Count,会弹出如下窗口
在"when the break point is hit"下拉列表里,我们可以看到四个选项
break always:总是中断
break when the hit count is equal to:等于某次数时中断
beak when the hit count is a multpile of:当次数是某数的倍数时中断
break when the hit count is greater than or equal to:当大于等于某数时中断
5. 数组
数组是我们使用最为频繁的一种数据结构。但当数组是以一个指针和其长度来表示时,查看窗口并不能直观地显示出数组中每个元素的值,而只能显示出该数组的起始地址以及它的第一个元素。下面就是一个例子:
为了显示出数组中所有元素的内容,我们可以在数组名的后面添加一个“, #”(#表示数组的长度)。如果我们在上面的数组名添加该后缀名就得到:
补充2014-2-28 : 调试状态下,watch栏里查看std::vector<T> x的某个index的值,输入:
((x)._Myfirst)[index]