• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

什么是Access Violation?我该如何调试它

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 45次 | 进入软件测试论坛讨论

领测软件测试网

什么是AV错误?我该如何调试它?

当你运行程式得到了一个AV(Access Violation)错误的时候,这意味着你的程式正在试图访问一块

不再有效的内存,请注意我所提到的“不再”有效。大多数的情况下,出现这个错误要么是因为你试图访问一块已经被释放的内存,要么是想使用一个还未创建对象的指针。

幸运的是:Win32的内存体系在不同的进程(Process)间使用了独立的地址空间。所以我们可以不必担心会访问到其他的进程中的地址空间而造成破坏,(在Win 16下就有这种潜在的危险).这也就意味着我们能够正确的利用错误对话框中的信息。

当我们得到一个AV错误对话框的时候,将会出现例如:Av at ddress ????的字样,如图:

这个时候把这个地址写下来(如图为:0X4006A620),回到程序中并且打开调试用的CPU窗口,右键选择"Goto Address",你将会发现出错的信息结构。

当然CPU窗口都是以汇编语言(Assembly)出现的.你可能对此不大熟悉。于是你就可以在窗口中滚动看看到底是哪个函数(funtion)调用了它。这样你就可以在这个地方设置断点了(breakpoint).

不幸的是,不是每个错误都是这么容易的捕捉到的。相对而言。指针问题是很难调试的。这里有个常规的法则就是:在删除指针指向的对象以后。请将它置为NULL。因此在调用的时候你可以先看看这个指针是否为NULL,如果是NULL,你可以在这个地方输出一些调试信息以方便你在发生AV错误的时候能精确的找到这个地方。

// ==================================================

译者注:比如这样:

if(pName==NULL)

MessageBox("Pointer pName is NULL","Hint",MB_OK);

这样在弹出这个对话框的时候就可以知道是这个地方错了

// =====================================================

最后一个比较保险的方式就是尽可能的在使用指针的地方设置断点看看是否它为NULL。

 

译者注:

这篇文章告诉了我们什么是AV,一般产生的原因和如何捕捉等。我觉得上面谈到的只是一些比较通用的法则。实际未必如此。比如大家知道由系统自动销毁的对象其指针未必就是NULL,

而想通过检测指针的值来判断AV的话,这种情况就不适合。还有一个方面就是出现AV的另外一种情况:指针未能初始化(Initalization)并未提到,当然这都要靠写程式的自己防止了。

另外文章中提到的删除对象后把指针置为NULL应该是大力倡导的,这点也是Scott Meyers所提到的,毕竟删除一个NULL指针是安全的,而删除一个已经删除的指针“其结果是不可预测的”.

 

文章出处:http://community.borland.com/article/0,1410,26406,00.html

 


延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网