- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
vc调试经验总结
调试经验总结-VC下的错误对话框
很早前就想写点总结将编程中遇到的各种错误刨根挖底地罗列出来。但是因为这些错误(VC中开调试器遇到的各种错误对话框)都是随机性的,真正想总结的时候又不想不起来有哪些错误。恰好最近运气比较背,各种错误都被我遇遍了,于是恰好有机会做个总结。
这里所说的VC下的错误对话框时指在VC中开调试器运行程序时,IDE弹出的对话框。
1.不是错误的错误:断言 .
将断言视为错误其实有点可笑,但是因为有些同学甚至不知道这个,所以我稍微提一下。断言对话框大致上类似于:
断言对话框是由assert引起的,在对话框上通常会给出表达式,例如assert( 0 ); 弹出对话框时就会将0这个表达式显示出来(Expression:0)。关于assert的具体信息建议自己google。这里稍微提一下一个技巧:有时候为了让assert提供更多的信息,我们可以这样写一个assert:
assert( expression Function : invalid argument! );
因为字符串被用在布尔表达式中时,始终为true,不会妨碍对expression的判断,当断言发生时(expression为false) 时,断言对话框上就会显示这个字符串,从而方便我们调试。
要解决这个问题,首先要确定断言发生的位置,如果是你自己设置的断言被引发,就很好解决,如果是系统内部的函数产生的,那么一般是因为你传入的函数参数无效引起。
?
2.内存相关:最简单的非法访问:
C、C++程序中经常误用无效的指针,从而大致各种各样的非法内存访问(写/读)。最简单的情况类似于:
这样的情况由类似以下代码引起:
char *p = 0;
*p = a;
当你看到类似于“写入位置XXXX时发生访问冲突“时,那么你大致可以断定,你的程序在某个地方访问到非法内存。开调试器对调用堆栈进行跟踪即可找出错误。
?
3.内存相关:不小心的栈上数组越界:
当你写下类似以下的代码时:
char str[3];
strcpy( str, abc );
就将看到如下的对话框:
?
对话框大致的意思就是说str周围的栈被破坏了,因为str本身就被放在栈上,所以strcpy(str,abc)多写入的\0就写到非法的栈区域。看到这样的对话框可以根据调用堆栈定位到错误发生的函数,然后检查此函数内部定义的数组访问,即可解决问题。
?
4.内存相关:不小心的堆上数组越界:并不是每次数组越界都会得到上面所描述的错误,当数组是在堆上分配时,情况就变得隐秘得多:
char *str = new char [2];
strcpy( str, ab ); //执行到这里时并不见得会崩溃
delete [] str;//但是到这里时就肯定会崩溃
以上代码导致的错误对话框还要诡异些:
似乎不同的DAMAGE对应的错误号(这里是47)都不一样,因为这里的错误发生在delete,而delete跟new很可能在不同的地方,所以这个错误调试起来不是那么容易,很多时候只能靠经验。
当看到类似的对话框时,根据调用堆栈跟到delete时,你就可以大致怀疑堆上数组越界。
?
5.调用相关:函数调用约定带来的错误:
这是所有我这里描述的错误中最诡异的一种,先看下对话框大致的样子:
对话框大致的意思就是说(没开调试器时对话框样式可能不一样),通过函数指针调用某个函数时,函数指针的类型(函数原型)可能与函数指针指向的函数的类型不一样。这里的类型不一致主要是调用约定(call conversation)不一样。如果函数类型(参数个数,返回值)不一样,一般不会出错。
调用约定是指调用一个函数时,函数参数的压入顺序、谁来清理栈的内容等。例如默认的C、C++调用约定__cdecl,对于函数的参数是从右往左压入。而__stdcall(WIN API的调用约定)则是从左向右压。我这里所说的函数类型不一样,就是指一个函数是使用__cdecl,还是__stdcall。例如以下代码:
?
#include iostream?void __stdcall show( const?char?*str ) { }?void __stdcall show2() { }?int main() { typedef void (*Func)( const?char?*); void?*p = show; Func my_func = (Func) p; my_func( kevin ); return?0; }?
?
因为Func默认地被处理为__cdecl,而show是__stdcall的,所以当通过函数指针my_func时,就导致了以上对
您可能关注的文档
- XXX公司营销人员岗位职责设计.doc
- XX经贸有限责任公司物资管理信息系统 开题报告[实用论文].doc
- TD机房操作.doc
- XX镇安全工作目标自查汇报材料.doc
- xx镇创文明城镇电视专题片解说词.doc
- S版一年级下册《快乐的小青蛙》教学教案 - 教育.doc
- Google是如何搜集互联网信息的.doc
- GPRS环保数据采集系统应用方案[解决方案].doc
- GPRS技术在卫星发射机监控中的应用[技术方案].doc
- MyOffice系统需求文档.doc
- 浙江金华市公共资源交易中心永康市分中心编外人员招考聘用笔试历年典型考题及考点研判与答案详解.docx
- 浙江宁波慈溪市政协办公室招考聘用编外工作人员笔试历年典型考题及考点研判与答案详解.docx
- 浙江金华永康市西溪镇人民政府招考聘用笔试历年典型考题及考点研判与答案详解.docx
- 福建南平市公安局建阳分局招考聘用辅警笔试历年典型考题及考点研判与答案详解.docx
- 浙江嘉兴海盐县武原街道基层残疾人工作专职委员(公益岗位)招考聘用笔试历年典型考题及考点研判与答案详解.docx
- 浙江宁波知识产权保护中心招考聘用工作人员笔试历年典型考题及考点研判与答案详解.docx
- 浙江杭州建德市面向2024届普通高校毕业生招考聘用教师(第二批)16人笔试历年典型考题及考点研判与答案详解.docx
- 浙江省台州中学面向2024届普通高校毕业生招考聘用教师12人笔试历年典型考题及考点研判与答案详解.docx
- 湖北师范大学体育学院专任教师招考聘用笔试历年典型考题及考点研判与答案详解.docx
- 重庆市南岸区教育事业单位面向2024届高校毕业生招考聘用114人笔试历年典型考题及考点研判与答案详解.docx
最近下载
- 2022年北京理工大学计算机科学与技术专业《数据库原理》科目期末试卷B(有答案).docx
- 某综合管廊机电安装工程施工组织设计.doc
- 2024年四川省泸州市中考文科综合试题卷.docx
- 【北宋】范仲淹《岳阳楼记》原文+翻译打印版.pdf
- 北京科改版初二下生物知识点总结.pdf VIP
- 【结题报告】《小学语文阅读教学深度融合核心素养培育研究》结题报告.pdf
- 2023年湖南省株洲市中考化学真题卷(含答案与解析).doc VIP
- 浙江省金华市金东区2023年小升初数学试卷 解析版.docx VIP
- 旅行商问题的求解方法(动态规划法和贪心法)算法论文.doc
- 《物质的比热》课件 .pptx VIP
文档评论(0)