vs2010错误列表如何跟踪_VS2010中的调试技巧总结
调试技巧的总结,内容整理自互联网
调试是软件开发周期中的一个很重要的部分,有时很有挑战性,有时候则让程序员迷惑,有时候让程序员发疯,但是。可以肯定的是,对于任何不是太那个微不足道的程序来说,调试是不可避免的。近年来,调试工具的发展已经使得很多调试任务简单省时了。
本文总结了十个调试技巧,当你使用VS的时候可以节省你很多时间。
1. 悬停鼠标查看表达式
调试有时候很有挑战性,当你步入一个函数想看看哪块出错的时候,查看调用栈来想想值是从哪来的。另一些情况下,则需要添加一些监视表达式,或者查看局部变量列表,这通常还是花费一些时间的,但是。如果你把你鼠标指向你感兴趣的一个变量。你会发现事情简单多了。而且,类和结构体可以通过单击展开。这样。你就可以方便快捷的找到你想查看的变量了。
2. 实时改变值 调试器不仅仅是一个分析程序崩溃或是异常结果的工具了,许多bug都可以通过步入新写的函数,检查函数是否如期望的那样运行来预防。有时候你可能会好奇“如果条件为真函数会正确运行吗”大多数情况下,根本不需要改变代码重启挑起,仅仅把鼠标悬停到一个变量上,双击值然后输入一个新值就可以了。。
3.设置下一条语句 一个典型的调试情况就是通过单步跟踪分析为什么一个函数调用失败了。当你发现一个函数调用的另一个函数返回错误的时候你会怎么做?重启调试?有更好的方法。拖动这个黄色的语句标识到你想下一步执行的语句前就可以了。比如你刚才失败的那块,然后步入。简单,不是吗?
4.编辑然后继续 调试一个复杂的程序,或是一个插件的时候,在一个被调用很多次的函数处发现一个错误。但是不想浪费时间停下来,重新编译然后重新调试。没问题,仅仅在该处改正代码然后继续单步就可以。VS会修正程序然后继续调试不需要重启
注意,编辑然后继续有大量的已知限制,首先,64位代码是不行的。如果他如果为你的C#程序工作。就去工程设置的生成选项,然后目标平台为x86.不要担心。发布版的目标平台和调试的时候是分开的。可以被设置为任何平台。。
第二.编辑然后继续改变在一个方法里应该是局部的。。如果你改变了方法签名,添加一些新方法或是类。你就不得不重启程序了。或者撤销改变来继续。改变方法也包含lambda表达式隐式修改的自动生成的代理类,因此也不能继续。
5.方便的监视窗口 大概现代的调试器都有一个监视窗口,无论如何。VS允许你简单的添加或移除变量。单击空行,输入你的表达式按下回车,或者是在不需要的表达式上按下Delete键就可以删除了。 而且。从监视窗口你不仅仅可以看到“正常”的变量。你可以输入$handles 来追踪你的程序打开了多少句柄(可以方便的修复内存泄漏) ,输入$err 可以看到上一个函数的错误码,然后使用工具-错误信息可以看到更详细的描述,或者输入@eax(64位是@rax)来查看包含函数返回值的寄存器。
6.带注释的反汇编 使用交互式的反汇编模式可以使得优化程序的关键部分变得很容易,VS给出对应你代码每一行的汇编指令,并且运行单步运行。同时,可以在任何位置设置断点。而且,表达式的查看和修改也像在C++代码里一样
7.带有栈的线程窗口 调试多线程的程序是痛苦的。。或者也可以是很有趣的。取决于你的调试器。VS2010真正优美的特性是线程窗口的栈视图,通过窗口的调用栈你可以方便的总览线程。
8.条件断点 如果你尝试通过断点再现一个罕见的事件,该情况引发了一些严重的错误。你可以添加条件断点。定义一个断点的条件,然后如果条件不成立,VS会忽略该断点
9.内存窗口 有些bug由不正确的结构体定义引起,忽略的对齐属性等等。查看内存中的内容可以定位然后修复bug。VS提供了一个放百年的内存窗口,可以把值以8/16/32/64位的形式展示。还有浮点值。也允许实时改变他们。就像在文本编辑器里一样。
10.转到定义 这个特性不是直接关于调试的,而是关于浏览大项目的。如果你尝试找到一些不是你自己写的代码中的错误,快速知道“这个类型是什么”或者“这个函数是干嘛的”,可以节省很多时间,VS通过一个转到定义命令方便了你。
11.命令窗口 第十一的技巧chaau已经建议过了。确实可以节省很多时间,VS支持命令窗口,可以通过,视图-其他窗口-命令窗口来启动。一旦激活,你可以输入不同的命令来自动化调试。举个例子。你可以通过如下命令 简单的模拟MFC COleDateTime 变量。
1
?
dt
.
Format
(
"%Y-%m-%d %H:%M:%S"
)
许可 本文包括源代码和文件在CPOL下授权
----------------------------------------------------------------------------------------------------------------------------------------
[原文发表地址]:Debugging Tips with Visual Studio 2010
[原文发表时间]:2010/8/19 10:48 AM
今天的博文包含了一些有用的能用于VS的调试技巧。 我的朋友Scott Cate(他写了很多很好的关于VS使用技巧和窍门的博客)最近向我强调了这些很好的技巧,大部分使用VS的开发人员好像不知道这些技巧(即使他们大部分都在产品开发组呆过一阵子)。 如果你还没有使用过这些技巧,希望这篇博文能帮你发现它们。 它们学起来很容易,能帮你节省很多时间。
运行到光标(Ctrl+ F10)
我经常看见人们是这样来调试应用程序的: 他们在应用程序需要调试的代码前设置一个断点,然后反复的敲F10/F11来逐步通过代码,直到到达他们真正想要研究的确切位置。有些时候他们需要仔细观察所跨过的每行代码,这样使用F10/F11 就很合理。 但是更普遍的是,他们只想快点进入他们真正关心的那行代码——这是使用F10/F11 就不是最好的选择了。
相反, 你可能想利用调试器支持的特性“运行到光标”。 只需简单地把你的光标放在代码中你想程序运行到的那一行,然后同时敲Ctrl+F10。这样程序就会运行到光标所在的那一行, 然后执行中止,由调试器控制——这样就节约了你反复敲击F10/F11到达那里的时间。即使你想运行到的那行代码不在当前调试的方法或类里,而是在一个独立的方法或类里,这也同样奏效。
条件断点
我们经常在可用性学习中见到另一个普遍的技巧:开发人员设置断点,运行程序,试着输入一些数据,当到达一个断点时,手工检查某种条件是不是成立,如果成立才决定进一步研究。 如果条件不符合他们想要的, 按F5继续执行程序,尝试另外一些输入,再手工重复同样的过程。
VS的条件断点功能提供了一个更加容易的方法来处理以上情况。 条件断点允许你只在某种明确指定的条件成立时才中止执行,由调试器控制。这帮你免于手动检查/恢复你的程序, 使得整个调试过程免去许多手工活,也不那么冗长乏味。
设置一个条件断点
设置一个条件断点十分简单,在代码里按F9为某一行设置一个断点:
然后右击断点——编辑器左边的红色圆圈,在右键菜单中,选择“条件…” :
将弹出以下对话框, 允许你指明某种条件,只有当这种条件成立时,断点才能达到。 例如:我们可以通过写下面的表达式来指明,只有当paginatedDinners列表元素的个数小于10时,才中止程序,由调试器控制。
现在, 当我重新运行程序来研究一下, 调试器只在这个查找返回值小于10时,才中止程序执行。 如果返回值不小于10 ,将不会触发断点。
命中次数功能
有时你只想在条件第N次成立时中止执行。例如:仅当第5次出现查找返回值小于10时,才中止执行。你这样启用这个功能:右击断点, 选择“命中次数…”菜单命令。
将弹出以下对话框, 允许你指明程序中断的条件:条件被第N次满足时,或者条件被满足的次数是N的倍数时,或者条件被满足的次数大于等于N次时。
机器/线程/进程筛选器
你可以右击断点,选择“筛选器…”菜单命令, 来指明断点只在某台特定的机器,或某个特定的进程或线程中才能被触发。
跟踪点——当击中断点时自定义行为
很多人不知道的一个调试功能是使用跟踪点。 跟踪点是一个断点, 当它被击中时,某种自定义的宏会被触发执行。当你想研究你的应用程序而又不想中止执行程序时, 这个功能特别有用。
我将用一个简单的控制台程序来演示如何使用跟踪点。 下面是斐波那契数列的递归实现:
在上面的应用程序中,针对特定的输入,我们使用Console.WriteLine()来输出最后的斐波那契数列。假如我们想在调试过程中研究斐波那契的递归过程——而不停止调试的执行? 跟踪点能帮我们很轻松地做到这一点。
设置跟踪点
你可以这样启用跟踪点:按F9在代码上设置一个断点, 右击断点,在右键菜单中选择“命中条件…”菜单命令:
将弹出以下对话框——允许你指定当断点触发时,进行何种操作:
如上所示,我们指定每次当断点的条件成立时,打印跟踪信息。注意我们指定了想要输出的局部变量“X” 的值作为输出信息的一部分。 局部变量能通过{变量名}的语法被引用。 也有内嵌的命令(像$CALLER,$CALLSTACK, $FUNCTION等等)可以用来输出跟踪信息中常见的值。
上面对话框的底部, 我们也选中了“继续执行”单选框——表示我们不希望调试器暂停程序。 相反,程序会继续执行——只是我们自定义的跟踪信息会在每次断点条件满足时输出,就这点不同。
现在当我们运行程序时,我们会发现自定义的跟踪信息会自动出现在VS的输出窗口中——使我们能看到程序的递归过程。
你也可以选择为你的程序设置一个自定义跟踪监听器——这样跟踪点的输出信息就会被重定向到它里面,而不是VS的输出窗口里。
跟踪点——运行自定义的宏
上周我在伦敦做了一次演讲, 听众中有个人问了这样一个问题:有没有可能当击中一个跟踪点时,自动输出所有的局部变量。
这个功能不是内置在VS中的, 但是可以通过在VS中写一个自定义的宏来启用它,然后设置一个跟踪点,当它被击中时,调用这个宏。 为了实现这个目的, 打开VS中的宏窗口(工具->宏->宏菜单命令)。然后在项目管理器“MyMacros”结点下面, 选择模板或者新建一个模板(如:添加一个名为“UsefulThings”的 模板), 再将下面的VB宏代码贴到模板里,并保存它:
Sub DumpLocals()
Dim outputWindow As EnvDTE.OutputWindow
??????? outputWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput).Object
Dim currentStackFrame As EnvDTE.StackFrame
??????? currentStackFrame = DTE.Debugger.CurrentStackFrame
??????? outputWindow.ActivePane.OutputString("*Dumping Local Variables*" + vbCrLf)
For Each exp As EnvDTE.Expression In currentStackFrame.Locals
??????????? outputWindow.ActivePane.OutputString(www.introzo.com + " = " + exp.Value.ToString() + vbCrLf)
Next
End Sub
上面的宏代码依次检测当前堆栈,获取所有的局部变量,并将其显示在输出窗口。
使用DumpLocals自定义宏
在下面这个简单的应用程序中,我们可以利用自定义的“DumpLocals”宏:
在上面的Add方法的return语句上,按F9设置一个断点。 右击断点,选择“命中条件…”菜单命令:
将弹出以下对话框,上例中,我们选中了“打印信息”的单选框,再手工指定希望输出的变量, 而这里, 我们选中“运行宏”的单选框,使它指向我们创建的自定义宏UsefulThings.DumpLocals:
我们仍然选中“继续执行”单选框,这样能保证当跟踪点被击中时,程序依然能够继续执行。
运行程序
现在当我们按F5运行程序,当调用Add方法时,我们将看见以下输出出现在VS输出窗口中。 注意当跟踪点被击中时,宏是如何自动列出各个变量名及其值的。
总结
VS调试器功能非常丰富。 我强烈建议大家抽出一些时间来学习它的所有功能。 以上的技巧和诀窍只是很多大家没有真正意识到的功能中的一小部分。
我之前写过其他一些关于VS2010调试器改进的博客(包括数据标签固定,断点导入导出,保留最后值变量, 等等)。 我将发表更多关于VS2010的智能跟踪和转储文件调试支持的博文。这些技术提供了很多非常酷的新功能,会让程序(包括产品中的程序)的调试变得非常简单和强大。
也请务必看看Scott Cate很棒的VS2010技巧和诀窍系列,你可以学习如何更好的利用VS。他有一些非常棒的免费视频和博客。
也要看看Jim Griesmer很棒的VS调试技巧和诀窍系列。 他有许多很好的可以利用的技巧和诀窍。
希望这能对您有所帮助。
一个vs2010的项目中包含了多个dll工程,最近由于修改,对其中的两个dll工程A、B都拷贝了一份分别命名为C、D,然后修改原始工程中的文件名和类名,以便和原来的名称相区分,防止一不小心弄错了就麻烦了
原始的是B调用A,新的当然也就是D调用C了,修改完后,C编译正常,编译D的时候出现了错误提示,如下:
1>e:\dll\bcom\bcom.h(32): error C2470: “CComMgrBin”: 看起来像函数定义,但没有参数列表;跳过明显的函数体
我修改的时候主要是把相关的文件在UltraEdit中打开,然后候其中的类和包含的文件名,这样修改方便,不用到IDE中一个一个修改。
这个错误有点奇怪,原始的都好好的,为什么就修改了文件名和类名就不行了呢?
上网上查了查,基本确定是类CComMgrBin定义的附近有错误,但看不出问题,各符号都没有修改,不可能会变成全角或者中文的,在D中修改包含的C的头文件后再编译D工程,提示找不到头文件,说明包含的头文件也是没错的。
CComMgrBin的类定义如下:
... // 包含需要的头文件
#ifdef BCOMBIN_EXPORTS
#define BCOMBIN_API __declspec(dllexport)
#else
#define BCOMlBIN_API __declspec(dllimport)
#endif
// 此类是导出的,其它模块需要调用之
class BCOMBIN_API CComMgrBin: public CMyTask
{
private:
CComMgrBin();
virtual ~CComMgrBin();
... // 其它的接口和变量
根据提示,在编译完C之后,修改
class BCOMBIN_API CComMgrBin: public CMyTask
一行如下:
class CComMgrBin: public CMyTask
即把其中的BCOMBIN_API删除掉,然后编译D,结果通过!那确定就是这个定义有问题,再仔细检查
#ifdef BCOMBIN_EXPORTS
#define BCOMBIN_API __declspec(dllexport)
#else
#define BCOMlBIN_API __declspec(dllimport)
#endif
中的else分支才发现,其中多了一个“1”,即
#define BCOMlBIN_API __declspec(dllimport)
需要删除中间的“1”,修改后如下:
#define BCOMBIN_API __declspec(dllimport)
然后恢复
class BCOMBIN_API CComMgrBin: public CMyTask再编译D通过!
原来是在手动修改 BCOMBIN_API 的时候,中间多写了一个字符1导致dllimport实际上没有被定义,所以在调用的模块中就认为是错误的了。
希望对大家有帮助
??
来源:http://www.introzo.com/gnielee/archive/2010/06/02/vs2010-features.html
??
?Visual?Studio?2010?已经发布1个多月了,个人感觉在使用过程中有些新功能确实方便了很多。在此分享一些比较实用的功能,也算是抛砖引玉欢迎大家来补充其他自己常用的功能特性。?起始页面?在近期项目列表中可以将一些正在开发或重要的项目Pin在列表中以方便下次使用。
??
?也可以右键项目名称打开项目所在文件夹。 ? ?分屏显示???????本次VS2010?使用WPF?进行了大量Shell?开发,所以软件界面功能有了重大改进。尤其要提的就是分屏编写功能,Dev不用再为频繁切换程序文件而头疼了。可以直接将程序文件拖拽出IDE窗口到其他?显示器中。这样就可以一边编写CS,一边编写XAML而且无需切换窗口标签。 ? ?高亮显示???????在编辑器中点击某个符号后IDE会自动将相同符号高亮显示。如果程序很长的话可以使用Ctrl+Shift+向下箭头?或Ctrl+Shift+向上箭头?快速浏览每一个使用该符号的地方。 ? ?缩放显示?通过Ctrl+鼠标滚轮?可以缩放代码字体大小,这个功能方便在演示过程中使用。 ? ?按使用生成代码???????这个功能好像也叫“先消费”,在编写程序过程中如果需要构造新类,程序员可以不打断思路直接使用该类,然后再重新生成这个类。这样可以提高Dev的开发效率。 ? ? ?矩形选择框???????在VS2008中可以通过Alt+鼠标左键?对代码进行选取,VS2010不仅可以选择矩形框,还可以选择零字符宽的矩形框并在其中输入内容。 ? ? ?调试数据跟踪???????在程序Debug过程中往往需要实时监控数据变化,VS2010?可以将数据Tip标签Pin在IDE窗口中随时跟踪数据变化。 ? ?在下图中随着while循环的进行,j值的变化也会随时体现在Tip标签中。 ? ?调用层次结构???????通过鼠标右键?浏览方法、属性、构造函数的调用层次结构,如果是刚接手的项目就可以用这个方法了解其相关程序结构。 ? ? ?定位搜索???????编辑(Edit)菜单中选择“Navigate?To”?或者通过Ctrl+,?打开定位搜索窗口。在搜索栏(模糊查询的功能很强)中输入查询内容,VS2010?将列出相关结果信息。 ? ?双击搜索结果可以直接转到代码所在位置。 ? ?首先感谢博客园兄弟姐妹们对上一篇《Visual?Studio?2010?实用功能总结?》的大力支持,本篇将继续为大家分享一些VS2010?的实用功能。VS2010?的功能远远不是几篇博文就能介绍完的,更何况有些功能本人也不会用到,所以我还是抛砖引玉希望大家也分享自己的使用心得。?缩略图预览???????其实这个功能在VS2010?RTM?发布前就被取消了,但我们仍然可以将其激活。首先确认Tools->Options?中“Enable?rich?client?visual?experience”?处于启动状态(如下图)。 ? ???????然后,在开始菜单(Run…)中运行以下命令,向注册表中添加ShowThumbnailsOnNavigation?项。 ??reg?ADD?HKCU\Software\Microsoft\VisualStudio\10.0\General?/v?ShowThumbnailsOnNavigation?/t?REG_DWORD?/d?1?? ?打开VS2010?项目通过Ctrl+Tab,预览已打开的项目程序。 ? ?智能感知???????在VS2010?中IntelliSense(智能感知)功能又进行了完善和加强,在我们输入一些关键字时,其搜索过滤功能并不只是将关键字作为查询项开头,而是包含查询?项所有位置。如下图所示,当输入“index”?后我们既可以看到“IndexOutOfRangeException”?又可以检索到TabIndex?项,这使得检索功能更加人性化。 ? ???????在上图中,我们定义了一个AsSoonAsPossible?的字符串变量,当输入“ASAP”?时VS2010?会根据Pascal?Casing?搜索到我们想要的变量名称。 ? ???????有时我们需要使用switch、foreach、for?等类似语法结构,在VS2010?中只需如入语法关键字,例如“foreach”,并点击两下Tab?键,VS2010?便会自动完成相应的语法结构。 ? ?以上智能感知功能可以提高开发人员的编程效率,可以让你早点回家陪GF?:) ?WPF?界面设计???????做WPF/Silverlight?的开发人员都知道,VS2010?对XAML?的界面的设计功能进行了很大改进,我们可以在VS2010?中直接拖拽设计XAML?界面布局。同时在使用
相关文章
- 10-05 长电科技表示,已具备4nm手机芯片封装能力,以及C
- 10-05 中国信息通信研究院公布可信隐私计算评估结果, Mo
- 10-05 信通院:2022年7月国内手机出货量1990.8万
- 10-05 Numpy.frompyfunc() 将计算单个值
- 10-05 C语言·删除数组第0个元素
- 10-05 (2)NumPy库初识(数组运算和运算)
- 10-05 什么是手机副卡
- 10-05 副手机卡可以独立吗?
- 10-05 手机主卡可以查询副卡的哪些信息
- 10-05 如何修复 WINDOWS 11/10 中磁盘空间使
- 10-05 4 款最佳 Windows 11 声卡可供选择
- 10-05 如何在 Windows 10/11 上加速 Goo
- 10-05 什么是增值电信服务
- 10-05 电信卡的定向流量包括哪些软件?
- 10-05 电信app叫什么名字
- 10-05 什么是独立显卡直连?
- 10-05 独立显卡直连是什么意思?
- 10-05 为什么复制密码后打开淘宝不弹出弹窗?
- 10-05 PHP提高培训学校_php软件培训中心
- 10-05 vs创建项目跳回创建窗口_vs2017创建项目无法
- 最近发表
0条大神的评论