码迷,mamicode.com
首页 > 其他好文 > 详细

VC 程序崩溃异常处理集锦

时间:2017-07-12 23:24:18      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:运行时 异常 崩溃 处理

1 Run-Time Check Failure: being used without being defined

场景

    将一个未曾初始化的结构体作为参数传递给一个函数,在运行时出现如上的错误,尽管没有在函数中使用,但是依然需要进行结构体的初始化,重申初始化的重要性

 

2 Run-Time Check Failure Stack around the variable ‘xxx‘was corrupted

场景

         查找所有xxx的引用,仔细推敲任何一处可能导致的数组越界问题,经常出现的情况:

1

    char szName[10] = {"hello,world"};

    char szCopy[8] = {0};

    strcpy(szCopy, szName);

2

    char szStr[2]= {0};

    sprintf(szStr, "%d", 12);

那么被写入szStr的数据长度应该为3(请不要忘记了‘\0‘,char[2]是不够的,会造成越界访问

 

在已损坏了程序内部状态发生了缓冲区溢出

场景

    release版本启用最大化速度O2,运行没有问题。禁用优化Od,情况下出现如下的错误:在已损坏了程序内部状态的test.exe中发生了缓冲区溢出。该问题并不是在执行代码的时候,出现的问题,而是在程序退出,系统进行清理的时候出现的问题。此时调用的堆栈终端在一下的代码:中断在gs_report.c文件的298行位置(_CRT_DEBUGGER_HOOK(_CRT_DEBUGGER_GSFAILURE),如下:

    

#if defined(_CRTBLD) && !defined (_SYSCRT)

    DebuggerWasPresent = IsDebuggerPresent();

   _CRT_DEBUGGER_HOOK(_CRT_DEBUGGER_GSFAILURE);

#endif 

    并不是在执行用户代码的时候出现的异常。

 

解决思路

    从后往前屏蔽代码,寻找引起问题的根源。

 

问题根源

    定位到在栈上生成一个类的对象,就会导致该问题。sizeof该类,长度值是1257,功能是大数据的搜索,是该类导致栈溢出了,所以使用动态new对象的方式解决了该问题。

   

4unresolved external symbol __ImageBase

错误         1       errorLNK2001: 无法解析的外部符号 ___ImageBase        LIBCMT.lib

错误         2       errorLNK2001: 无法解析的外部符号 ___ImageBase        LIBCMT.lib

解决

    项目平台:Win32

    在链接器>>系统>>子系统中选择了WindowsCE(/SUBSYSTEM:WINDOWSCE)

    应该是Windows(/SUBSYSTEM:WINDOWS)


VC 程序崩溃异常处理集锦

标签:运行时 异常 崩溃 处理

原文地址:http://fengyuzaitu.blog.51cto.com/5218690/1946838

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!