vs2010断点使用技巧
msdn:http://msdn.microsoft.com/zh-cn/library/vstudio/5557y8b4.aspx
有很多断点的文章。
为提供更大的灵活性,Visual Studio 调试器使您能够设置属性以修改断点的行为:
Hit Count 使您能够确定在调试器中断执行之前命中断点的次数。在默认情况下,每次命中断点,调试器就中断执行。通过设置命中次数,您可以让调试器每命中两次断点中断执行一次,也可以每 10 次、每 512 次或任意选择的次数中断一次。程序中的某些 bug 不会在第一次执行循环、调用函数或访问变量时显现出来,这时候命中次数设置就很有用了。有些时候,bug 直到重复 100 次或 1000 次时才显现出来。此时可以设置命中次数为 100 或 1000 以解决问题。
Condition 是一个表达式,它确定断点是命中还是跳过。当调试器到达该断点时,它会计算条件的值。只有当条件满足时,断点才会命中。可以在某个位置断点处设置条件,只有当条件为真时,才会中断执行。例如调试一个银行程序,其中的帐户余额不允许小于零。可以在代码中的某些位置设置断点并附加以下条件:balance < 0。运行程序时,当余额小于零时,执行就会在这些位置中断。然后,就可以在第一个断点处检查变量和程序状态,再继续执行到第二个断点位置,如此继续。
Action 指定在命中断点时应执行的操作。默认情况下,调试器中断执行,但是您可以选择打印一条消息或者运行一个 Visual Studio 宏。如果选择打印消息而不是中断,则断点的效果与 Trace 语句非常类似。这种使用断点的方法称为跟踪点。
Filter 提供了一种为断点指定进程或线程的方法。
说明: 一个特别有用的技巧是在“调用堆栈”窗口中设置断点。使用“调用堆栈”窗口,您可以在特定的函数调用处设置断点。在调试递归函数(调用自身的函数)时,这个功能尤其有用。如果在一定次数的调用后中断执行,可以使用“调用堆栈”窗口在先前发出而尚未返回的调用中设置断点。调试器会在退出当前的调用过程中遇到该断点并中断执行。
我最开始对for循环的命中次数有一个误解,看下面的一个实例:
#include<iostream>
using namespace std; int binarySerach(int a[],int len,int key)
{
int begin=,end=len-;
int mid;
while(begin<=end)
{
mid=begin+(end-begin)/;
if(a[mid]==key)
{
return mid;
}
else if(a[mid]<key)
{
begin=mid+;
}
else
{
end=mid-;
}
}
return -;
} int main()
{
int n;
cout<<"输入数字的维度"<<endl;
cin>>n;
int *a=new int[n];
cout<<"输入各个元素"<<endl;
for(int i=;i<n;i++)
{
cin>>a[i];
} 1: for(int i=0;i<n;i++)
{
2: cout<<a[i]<<" ";
}
cout<<endl;
cout<<"二分查找的结果为"<<endl;
int ret=binarySerach(a,n,);
cout<<ret<<endl;
}
我最开始在1处设置断点,(即:for语句上)
按F5发现没有起作用,输入完成之后就结束了。
我试着在for语句内即2处: cout<<a[i]<<" "; 设置刚才的断点。发现起作用了。
当第二次命中cout<<a[i]时程序就暂停了,(注意没有输出3)。
说明for语句只命中了一次。
condition断点:
断点条件是一个到达断点时调试器将计算的表达式。 如果满足条件,调试器将检查如何:指定命中次数,以确定是否中断(或执行另一个指定的操作)。
条件可以是调试器能够识别的任何有效表达式。 在银行程序,例如,您可以设置等断点条件 balance < 0,例如 myLocalVariable > 1。 有关有效表达式的更多信息,请参见调试器中的表达式。
如果在设置断点条件时使用了无效语法,将立即出现警告消息。 如果在指定断点条件时使用的语法有效但语义无效,则在第一次命中断点将出现警告消息。 在这两种情况下,当命中无效断点时,调试器都会中断执行。 只有当条件有效并且条件的计算结果为 false 时,才会跳过断点。
调试器中的表达式
Visual Studio 调试器包括表达式计算器,当您在“快速监视”对话框、“监视”窗口或“即时”窗口中输入表达式时,这些计算器可以对其进行计算。 这些表达式计算器还可以在“断点”窗口和调试器中的许多其他位置使用。
本节描述在调试器中输入表达式时可以使用的语法。 分为下列几部分:
小技巧:
跳到当前光标处(Ctrl+F10)
我经常看到人们为了到达目标代码位置,而在程序中早早设定了断点,然后反复地按F10/F11,一步步走到目标代码处。当程序员的确需要仔细观察每一步的状态变化时, F10/F11是合理的选择。然而多数情况下,人们只想快速到达他们真正关心的代码处,这时候F10/F11就不是最佳选择了。
这时,你应该利用“跳到当前光标处”这个功能。先把光标定位在要测的目标代码行上,再同时按Ctrl和F10,被测程序将直接跳到该行停下。你再也不用按许多次F10/F11了。即使目标代码位于独立的类或方法中,你仍然可以从当前正在检查的地方跳过去。
太强大了,ctrl+F10可以按多次。
ctrl+F7停止调试,会有提示:是否停止调试,
停止调试更好的方法:shift+F5
断点设置里还有一个断点条件:
点击命中条件:
(这么我们勾选【打印消息】。
我们勾选“打印一条消息(Print a message)”复选框,输入一串文本,默认情况下,你输入的文本会被直接打印到调试的输出窗口里面来。除了:
a. 以$符号开头的几个关键字。比如$FUNCTION就会被替换成断点所在的函数名。其他有一些关键字在“When Breakpoints Is Hit”窗口当中有详细的说明。
b. 使用 大括号 {}包含起来的变量名,这样的字符串会被替换成变量的值。)
我们现在想在下面这段代码:
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
在调试时输出奇数的a[i]。应该怎么设置。
设置设置condition:
a[i]%2==1。
然后设置命中条件:
Function: $FUNCTION, Thread: $TID $TNAME {a[i]} 是奇数
在默认的Function: $FUNCTION, Thread: $TID $TNAME 加上{a[i]}是奇数即可。
调试完后,下面的调试窗口会输出以下信息:
Function: main(void), Thread: 0xC410 主线程 1 是奇数
Function: main(void), Thread: 0xC410 主线程 3 是奇数
Function: main(void), Thread: 0xC410 主线程 5 是奇数
程序“[50188] oj.exe: 本机”已退出,返回值为 0 (0x0)。
参考了:http://www.cnblogs.com/killmyday/archive/2009/09/27/1574919.html
跟踪点—进入断点时的自定义操作
许多人不知道“跟踪点(TrackPoints)”这个调试功能。“跟踪点“是种特殊的断点,当它被命中时,它会触发一系列自定义操作。如果你想观察程序的行为,而又不想中断调试的时候,这个功能尤其有用。
我将用一个简单的控制台程序来演示如何使用“跟踪点”。如下是斐波那契数列的一个递归实现:
int fibonacci(int x)
{
if(x<=)
{
return ;
}
else
{
return fibonacci(x-)+fibonacci(x-);
}
}
在fibonacci下面的{ 设置断点:
在上例中,我们同时选中了底端的“continue execution“选项,这说明我们不希望程序中断调试状态,而是继续运行。唯一的不同是:每次断点条件满足时,我们的自定义追踪信息都将被输出。
现在当我们运行程序时,会发现自定义追踪信息自动显示在Visual Studio的“输出“窗口里。这让我们很容易看到程序的递归调用过程:
调用Fibonacci(5),按F5,debug窗口输出:
Function: fibonacci(int), Thread: 0x1358 主线程 x=
Function: fibonacci(int), Thread: 0x1358 主线程 x=
Function: fibonacci(int), Thread: 0x1358 主线程 x=
Function: fibonacci(int), Thread: 0x1358 主线程 x=
Function: fibonacci(int), Thread: 0x1358 主线程 x=
Function: fibonacci(int), Thread: 0x1358 主线程 x=
Function: fibonacci(int), Thread: 0x1358 主线程 x=
Function: fibonacci(int), Thread: 0x1358 主线程 x=
Function: fibonacci(int), Thread: 0x1358 主线程 x=
程序“[] oj.exe: 本机”已退出,返回值为 (0x0)。
(如果你仔细分析上面的输出结果,你会发现递归到底是怎么执行的。)
你也可以选择往应用程序中添加一个自定义追踪信息的监听器。这时追踪点的输出信息将通过它输出,而不是Visual Studio的“输出“窗口。
2篇好文:
http://kb.cnblogs.com/page/92158/
http://blog.csdn.net/qwang24/article/details/4087423
vs2010断点使用技巧的更多相关文章
- VS2010断点调试技巧
设置断点:在如下图中的红色圆点处设置断点,红色圆点表示已经在这行设置断点.快捷键F9. 启动调试:按F5或者点击左边红框中的按钮.右边框是开始执行(不调试)Ctrl+F5. 调试工具栏:下面是工具 ...
- Chrome JS断点调试技巧
Chrome调试折腾记_(2)JS断点调试技巧 技巧一:格式化压缩代码 技巧二:快速跳转到某个断点的位置 技巧三:查看断点内部的作用范围[很实用] 技巧4:监听事件断点 技巧5:DOM及 XHR监听跳 ...
- (转)Intellij IDEA 2017 debug断点调试技巧与总结详解篇
背景:详细介绍idea的debug调试过程 Intellij IDEA 2017 debug断点调试技巧与总结详解篇
- 【工具】VS2010常用调试技巧(1)
调试是一个程序员最基本的技能,其重要性不言自明.不会调试的程序员就意味着他即使会一门语言,却不能编制出好的软件.本文就本人在开发过程中常用的调试技巧作下简单呢介绍,希望对大家有所帮助,能力超群者请绕道 ...
- VS2010 断点无效肿么办?
[1]分析原理: 1. 断点无效是因为目标文件和源文件的更新时间不一致, 编译器不认为当前的源文件是目标文件的当前版本. 2. IDE不会关心源文件的编码格式,能读入即可, 另存为Unicode或AS ...
- Chrome调试ECMAScript之断点debug技巧大全!
这篇文章主要介绍了使用Chrome调试JavaScript的断点设置和调试技巧,需要的朋友可以参考下 你是怎么调试 JavaScript 程序的?最原始的方法是用 alert() 在页面上打印内容,稍 ...
- C# 基础知识和VS2010的小技巧总汇
看了一些基础视频,才发现自己的基础比较薄弱,有很多基础知识都不知道.这里总汇一些基础知识. 1: foreach不仅可以作用于list类的索引集合,还可以遍历dictionary类,这一点比for更简 ...
- 解决VS2005 VS2008 vs2010断点无效-源代码与原始版本不同
网上说的方法:(额~但是我就是不能用.但是也贴出来) 方法1.直接把整个文件格式化了一次,断点就可以用了Ctrl + A全选菜单:编辑-〉高级-〉设置选定内容的格式 (Ctrl+K, Ctrl+F)通 ...
- Intellij IDEA 2017 debug断点调试技巧与总结详解篇
转载自csdn----------------------------------------------------------------------https://blog.csdn.net/q ...
随机推荐
- TMT行业分析师
诚聘英才 - 传媒梦工场 TMT行业分析师 工作经验: 2年以上 发布日期: 2013-01-04 最低学历: 本科 管理经验: 否 工作性质: 全职 招聘人数: 1人 职位类别: 金融 ...
- 如何提取出ppt中的文字?
最近在看一位老师的教学视频,视频里大部分的知识都记录在ppt里,于是很想将ppt中的文字提取出来,如果我一页一页地粘贴复制的话,效率低到吓人,因为一章的ppt有130多页,于是在网上搜索了一下方法,与 ...
- jQuery EasyUI 数字框(NumberBox)用法
这里的options是选项,可以参考下表: 选项名 类型 描述 默认值 min 数字 文本框中可允许的最小值 null max 数字 文本框中可允许的最大值 null precision 数字 最高可 ...
- android中使用jni对字符串加解密实现分析
android中使用jni对字符串加解密实现分析 近期项目有个需求.就是要对用户的敏感信息进行加密处理,比方用户的账户password,手机号等私密信息.在java中,就对字符串的加解密我们能够使用A ...
- Django的TemplateResponse
def my_render_callback(response): return response from django.template.response import TemplateRespo ...
- Register/unregister a dll to GAC
gacutil /i "C:\Test.dll"gacutil /u "Test"
- virtual 关键字
virtual 关键字用于修饰方法.属性.索引器或事件声明,并且允许在派生类中重写这些对象.例如,此方法可被任何继承它的类重写. public virtual double Area() { retu ...
- 记一次排查log4net 不输出日志的解决过程
最近发现log4net 不输出日志了,重点排查几个地方,发现都没有问题. 1.[assembly: log4net.Config.XmlConfigurator(ConfigFile = " ...
- 【JAVA】修改项目包名
从最后一层开始修改,一步步往上递增修改.
- linux驱动: 如何向模块传递参数, module_param和module_param_array
如何向模块传递参数,Linux kernel 提供了一个简单的框架. 1. module_param(name, type, perm); name 既是用户看到的参数名,又是模块内接受参数的 ...