用VSTS代码验证工具捕捉C/C++错误

2016-02-19 20:53 5 1 收藏

get新技能是需要付出行动的,即使看得再多也还是要动手试一试。今天图老师小编跟大家分享的是用VSTS代码验证工具捕捉C/C++错误,一起来学习了解下吧!

【 tulaoshi.com - 编程语言 】

对一个C++本机代码(Native Code)开发者来说,Visual Studio Team System对整个软件开发周期都提供了支持,VSTS源代码注释使开发者在静态代码分析或单元测试中,可以用方法参数前置或后置的有效条件来注释方法,且当注释违例时,会有相应的编译器警告,所以,可以这样说,VSTS提供了许多功能来帮助本机程序开发者。本文将着眼于VSTS验证程序,它是一个分析工具,用于监控非托管代码的执行,并可以发现如不正确的内存分配、句柄使用等等错误。  与此相比,动态分析是检查那些传递给系统函数的要害变量值,以发现问题的,当方法被调用时,将会探测到某些非法参数,并上报给开发者;而使用非法参数时,某些问题不能被发现,只会在后续情况如内存崩溃、非正常程序退出等情况显现出来。  以应用程序验证程序开始  启动应用程序验证程序是一件非常简单的事,只需选择“调试-以应用程序验证程序开始”即可,如图1所示。  图1:启动应用程序验证程序  第一次使用应用程序验证程序时,Visual Studio会提示你下载一个额外的DLL,此DLL将用于检查句柄及堆,可能需要治理员权限来安装这个补丁。  对应用程序验证程序的大多数使用者来说,最难之处在于要记住运行这个验证程序,而不是启动一次标准的调试会话。假定在使用验证程序时,也可以使用标准调试,建议启动验证程序会话(Shift+Alt+F5),虽然比启动调试会话(F5)多按了两个键,但还是值得的。这样一来,就可以在每次产生调试会话时,都充分利用验证程序了。  当应用程序验证程序探测到一个问题时,它会停止执行流程,并显示一个如下的对话框,如图2所示:  图2:验证程序停止信息  通常来说,诊断此类问题一般为查看能导致验证程序停止执行的句柄、锁、或堆指针信息,并回溯到崩溃发生之前的执行点。然而,这不会总是最简单的调试方法,在堆或文件崩溃是问题的唯一原因时,你不一定记得起来要启动一个调试过程。  当验证程序停止执行流程时,一个具体的问题描述也会被添加到任务视图中,如图3所示。任务视图中的信息便于观看,而图2的对话框则需要先“消失”,开发者才能进入到调试器检查变量值。  图3:验证程序任务列表视图  此处多说一下任务列表,它可显示一个单独的应用程序验证程序窗口,其对停止事件提供了最具体的信息(见图4)。  图4:验证程序窗口  应用程序验证程序检查  VSTS应用程序验证程序主要专注于以下三个核心领域:操作系统句柄、锁、堆内存。以上三种类型的检查,句柄是最简单的——应用程序验证程序会检查句柄以保证它不为空(null)、句柄指向了正确的操作系统对象类型、句柄未用于DLLMain函数中的等待操作(这可是解决死锁问题的最好方法)。  锁检查就包括以下方面:  Ø 检查初始化操作是否未完成或过头了  Ø 释放保持锁的内存或卸载相应模块  Ø 锁是否具有非法所有者  Ø 已损坏的锁  堆检查也遵循上述两种检查的相近模式,将会检查是否有损坏的堆、非法的堆删除操作、非法的堆句柄、堆溢出。  配置应用程序验证程序  应用程序验证程序需要进行配置的地方非常少,如图5所示:  图5:验证程序配置  除去可以把这三个主要的验证功能打开或关闭之外,你还可以与保护页(guard page)一起使用堆验证,或直接指定堆保护页的位置(保护页提供了对崩溃最初的探测,以防止其占用更多的内存)。堆保护页的默认位置为分配区域的末尾,它可以探测到缓冲区溢出;然而,假如想要探测非常罕见的某些缓冲区欠载(即底面通过),你也能把它挪到分配区域块的起始处。  应用程序验证工具是VSTS众多工具中最轻易使用的一个,只需简单地选择此菜单项就可以开始你的调试会话了,让它来帮助你追踪那些讨厌的本机代码问题吧。

来源:https://www.tulaoshi.com/n/20160219/1624773.html

延伸阅读
一、绪论 当微软推出VS.NET7实现了可扩展的托管C++后,C++程序员们反映不一。尽管大部分的程序员对于能够继续使用C++感到很欣慰,但几乎所有的人对于托管C++提供的晦涩语法感到很痛苦。微软明显从反馈中感觉到托管C++不是那么成功。 2003年10月6日,ECMA(欧洲计算机制造商协会)宣布成立专家组,负责结合ISO标准C++与通用语言,开发一个可...
C/C++语言中有许多对初学者(甚至是有经验的编程人员)来说很轻易范的错误。通晓这样的错误可使你免于陷入其中。 忘记初始化指针 !-- frame contents -- !-- /frame contents -- 这种错误只是一般"忘记初始化变量"错误的一个非凡形式(C/C++中变量不会自动初始化,而Basic可以)。使这种错误更糟糕的原因是它的后果往往更加糟...
代码如下所示: 代码如下: PRE class=cpp name="code"#include stdio.h #include math.h int main() {  int x,y;  printf("求x的y次幂:\n");  scanf("%d %d",&x,&y);  printf("结果是:%.2f",pow(x,y));  //要以%f输出  %d输出结果都是0  return 0; } /PREBR PRE/PRE P /P PRE/PRE PRE/PRE
标签: PHP
  Author: Mitchell Harper 翻译    :Kefeng Nie (kefeng_nie@163.com) Date   :2002-10-15   一,简介   如果你对Unix/Linux有所了解的话,你应该知道他们大都自带了C和C++的编译器,分别是GCC和G++。Unix在程序安装及Make等许多地方使用到了这些编译器。利用一些控制台命令,C++和PHP, 我将...
一般软件都要输入序列号(SN),而大家平时用的最多的恐怕是盗版软件,通常盗版软件的序列号(SN)都保存成:XXXXX-XXXXX-XXXX-XXXX的形式。 而软件输入序列号的地方通常都是几个文本框(TextBox)组成。一个个的将XXXXX复制到文本框将非常麻烦。于是SN快速输入工具便由此产生了。 当然这些都和我的编写这个程序的原因无关。我编写这个...

经验教程

484

收藏

32
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部