【转】VS调试技巧
【转自】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]
【转】VS调试技巧的更多相关文章
- 【工具】VS2010常用调试技巧(1)
调试是一个程序员最基本的技能,其重要性不言自明.不会调试的程序员就意味着他即使会一门语言,却不能编制出好的软件.本文就本人在开发过程中常用的调试技巧作下简单呢介绍,希望对大家有所帮助,能力超群者请绕道 ...
- Visual Studio高级调试技巧
1. 设置软件断点,运行到目标位置启动调试器 方法①:使用汇编指令(注:x64 c++不支持嵌入汇编) _asm 方法②:编译器提供的方法 __debugbreak(); 方法③:使用windows ...
- 【转】你所不知道的Android Studio调试技巧
这篇写Android studio debug技巧个人觉得写得不错,转自:http://www.jianshu.com/p/011eb88f4e0d# Android Studio目前已经成为开发An ...
- VS调试技巧,提高调试效率(转):
如果你还没有使用过这些技巧,希望这篇博文能帮你发现它们. 它们学起来很容易,能帮你节省很多时间. 运行到光标(Ctrl+ F10) 我经常看见人们是这样来调试应用程序的: 他们在应用程序需要调试的代码 ...
- iOS各种调试技巧豪华套餐
转载自http://www.cnblogs.com/daiweilai/p/4421340.html 目录 前言 逼优鸡 知己知彼 百战不殆 抽刀断Bug 普通操作 全局断点(Global Break ...
- xcode调试技巧
xode报错有时挺无厘头,完全不知道哪里出的问题,最后还得用排除法,记录一些工作中认为有用的调试技巧 1.左侧视图点断点视图,左下角点加号,选择exception breakpoint,类型选c++, ...
- 你所不知道的Android Studio调试技巧
转载:http://www.jianshu.com/p/011eb88f4e0d Android Studio目前已经成为开发Android的主要工具,用熟了可谓相当顺手.作为开发者,调试并发现bug ...
- Visual Studio原生开发的20条调试技巧(下)
我的上篇文章<Vistual Studio原生开发的10个调试技巧>引发了很多人的兴趣,所以我决定跟大家分享更多的调试技巧.接下来你又能看到一些对于原生应用程序的很有帮助的调试技巧(接着上 ...
- Visual Studio原生开发的10个调试技巧
这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其他一些同样有用的技巧.我整理了一些Visual Studio(至少在VS 2008下)原生开发的调试技巧.(如果你是工作在托 ...
- Visual Studio的调试技巧
Visual Studio的调试技巧 [原文地址] Debugging Tips with Visual Studio 2010 [原文发表日期] 2010/8/19 10:48 AM 这是我写的关于 ...
随机推荐
- [转] add-apt-repository
PS: 有些项目提供的是deb 地址,那么把deb地址加到repository里,下面是一个例子: sudo apt-get update sudo add-apt-repository 'deb h ...
- 自定义filter包
在有些时候,你可能需要以你的所有项目进行全局的过滤. 因为你的项目可以设计到互相的依赖和调用 . 修改在tomcat下的conf下的web.xml文件.和在原来的web-inif下的修改一样,添加fi ...
- PHP: 深入pack/unpack <转> [链接]
PHP: 深入pack/unpack PHP: chr和pack.unpack那些 PHP: pack/unpack补遗
- Day7 - Python基础7 面向对象编程进阶
Python之路,Day7 - 面向对象编程进阶 本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...
- HTML5音乐播放器
//HTML5部分 <a href="javascript:void(0);" onclick="getCurrentTime('firefox');"& ...
- JAVA中的finalize()方法
[转]JAVA中的finalize()方法 今天早上看Thinking in java的[第四章 初始化和清除].[ 清除:终结和垃圾回收]的时候, 看到了这个东西. 用于清理滴... 当然,这个方 ...
- 在Cognos报表中使用钻取特性,参数传递
转载至:http://blog.sina.com.cn/s/blog_6eda1c4e0100mu3t.html Cognos的钻取方式大致可以分为三种: 1.模型固有的->由CUBE和DMR支 ...
- Direct2D 加载位图
说明: 通过WIC从文件加载位图. 可缩放后加载到内存. 源码: HRESULT LoadImageFormFile( IWICImagingFactory *pWicFactory, ID2D1Re ...
- JQUERY 常用方法大全
Attribute: $("p").addClass(css中定义的样式类型); 给某个元素添加样式 $("img").attr({src:"test ...
- Kafka笔记--指定消息的partition规则
参数的设定:参考资料 不错的资料:http://blog.csdn.net/honglei915/article/details/37697655 http://developer.51cto.com ...