关于Visual Studio 2008调试的一些经验以及错误(0xXXXXXXXX处最可能的异常: 0xC0000005: 写入位置 0x00000014 时发生访问冲突)
最近关于调试的经验教训
Visual Studio 2008调试的一些经验
学习vs2008的调试功能十分重要,在程序中难免遇到bug,如何定位bug,解决bug,就涉及到了调试的用法和技巧,这篇文章结合最近遇到的问题和体会,做一个总结,先讲一些流程性的,再针对一个具体问题介绍调试方法。
常规的调试的思路
在测试发现并报告bug之后,一个常规的调试的思路如图所示:
基础的调试按钮的含义以及一些快捷键
有了测试的思路之后,就可以开始调试了,但首先应了解一些基础的调试按钮的含义以及一些快捷键。
- F9快速断点设置
- F5调试输出
- 变量监视(调试——>窗口)
- 用堆栈(调试——>窗口)
- 过程调试(F10):
在断点处,如果希望继续执行程序,则可按F5键,程序会运行到下一个断点的代码行处。
如果要一步步查看程序的执行情况,以及变量、属性值等,可按F10键. - 逐语句调试(F11):
在调用函数的情况下,逐过程调试将执行函数,然后跳过函数体;逐语句调试能够看到函数体内的代码逐句执行的情况。加入WriteLine方法来辅助输出调试信息。 - 断言的使用
Debug类(命名空间System.Diagnostics)
Debug.Assert(表达式,string str):表达式,测试条件,str:提示消息。
测试是调试的入口,重心在于设计输入数据让特定问题出现的技巧。 - 调试不等于测试,调试重心在于修正语法错误和逻辑错误的过程,重点在于定位问题。
具体的工具栏,注意:调试过程中前向后向的使用容易被忽略,好好利用可以减少反复开始调试的麻烦。
错误:0xXXXXXXXX处最可能的异常: 0xC0000005: 写入位置 0x00000014 时发生访问冲突。
接下来就要介绍一类型比较难以查找的错误:0xXXXXXXXX处最可能的异常: 0xC0000005: 写入位置 0x00000014 时发生访问冲突。
这类错误通常很难查找,因为不是由于哪里写错了导致,一般来说产生这种错误的方式主要有以下三个原因:
上面的意思就是你把值付给了不该赋给的变量,或者说你把值付给了不能付给的变量(或者常量)
- 最简单也最直接的错误可能就是scanf()的问题,我们都知道输入的时候都是scanf("%格式",&变量),那么除了字符串(可要&,可不要)之外,所有的输入都需要&,如果你丢了,在很多编译器上变异的时候是查不出来的,也就是说是没有错的,但是输入数据会差生上述错误,是因为写成scanf("%格式",变量)这种形式了,这样你所输入的变量就不知道会存储到哪里。
- 空指针赋值的问题。
我们知道如果某一个指针是空的是不能直接给他赋值的原因是空指针不知道指得什么东西,那么他没有固定的内存,现在你给他赋值,通俗点理解就是他不知道该怎么存,也不知道存在哪,也不会储存,但是现在你有需要让他存储,那么就会出现上述的问题,这时候解决办法就是重新申请空间(用malloc或者new),或者是你尽量避免他成为空指针,或者是当他有成为空指针的可能性时,你就单独讨论。在c++中要注意是不是没有new出来或者之前的指针没有释放(release) - 还有一种可能性就是指针没问题,有正常的创建和释放,但是你在赋值过程中把一个空的值赋给了指针(可能由于数据不存在或者没计算出来导致有空值),这样的程序可以通过编译,但是当你用到部分功能的时候就会报出上述的错误。