AccessViolation错误调试总结

【转载请注明出处及作者,文章发现问题会随时更新,要保证浏览最新版本,请访问官网:blog.qdac.cc】

Access Violation错误是现代计算机编程中常见的一种错误,我在这里将自己调试的经验做个简单的总结,供大家参考。

1、什么情况下发生Access Violation(访问违例,简称AV错误)错误?

Access Violation错误是你的代码是访问一个无效的地址的内容时出现的。根据你的操作,提示可能是:

Access violation at address XXXX,read address YYYY

Access violation at address XXXX,write address YYYY

前者说明你的读取一个无效的地址,后者访问你在写一个无效的地址。

2、什么样的地址是无效的?

(1)、已经被释放的地址。

(2)、未分配的地址。

(3)、越界的地址。

(4)、试图在只读的内存块中写入数据。

3、访问无效地址一定会出现AV错误吗?

不一定。这有几种情况:

(1)、你所释放的内存并没有被返回给操作系统,仍被你进程缓存,此时当然也就不会出现AV错误。

(2)、你所访问的内存越界后的地址位于你进程所属的其它对象的内存块上,这种不会出现AV错误,但后果可能更严重。

(3)、你所使用的函数没有对当前内存地址进行任何读写操作,当然也就不会触发AV错误。

4、怎么能够快速找到AV错误的来源?

一看:看出错的内存地址,如果是000000x等很小的值,那基本上可以确定是你访问的对象的地址为空,检查出现异常的堆栈,基本上很容易找到出错的源代码。

二断:在调试器中设置断点,如果不是每次都出现的断点,可以用assert/__assert设置条件断点,然后在出错时,看看出错的堆栈,按堆栈逐级往上找源码。如果不想用assert,可以设置条件断点(方法:在相应的行前点击或者直接F5设置断点,然后在前面的红色标记上右击选择Breakpoint Properties)。

ConditionBreakPoint

三记:有时候AV错误很难重现,我们就要记录日志。这种时候,推荐使用一些日志记录工具来记录出错时的各个线程的堆栈状态,说不定就能找到问题的所在。记日志时,对怀疑对象的构造和析构函数分别记录日志,最后通过日志进一步的分析,最终找出结果。

 

 

分享到: