VC 程序崩溃异常处理集锦

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]是不够的,会造成越界访问

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

场景

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)

时间: 2024-11-05 13:31:19

VC 程序崩溃异常处理集锦的相关文章

安卓程序崩溃异常处理

  我们经常会面临这样的情景:应用发布上线后,收到用户反馈说app崩溃了,但自己重现不了.这时候怎么办呢? 很多朋友都会想到用友盟等第三方插件实现,但鉴于安全性要求较高的支付系统,是不允许使用未知来源压缩包/有后门的第三方插件.这时候我们可以考虑自己写一个. package System.Interface.free; import java.lang.Thread.UncaughtExceptionHandler; import android.app.AlertDialog; import

Android程序崩溃异常收集框架

最近在写Android程序崩溃异常处理,完成之后,稍加封装与大家分享. 我的思路是这样的,在程序崩溃之后,将异常信息保存到一个日志文件中,然后对该文件进行处理,比如发送到邮箱,或发送到服务器. 所以,第一步是先定义一个接口,用于在保存好日志之后的回调.代码如下: /* * @(#)CrashListener.java Project: crash * Date:2014-5-27 * * Copyright (c) 2014 CFuture09, Institute of Software, *

如何定位Release 版本中程序崩溃的位置 ---利用map文件 拦截windows崩溃函数

1       案例描述 作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭.请与您的供应商联系.呵呵,这句微软的“名言”,恐怕是程序员最怕见也最常见的东西了. 在一个大型软件的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现程序崩溃并不可怕,反而是测试的成功.作为开发的我们更需要关心的是程序中的哪个函数或哪一行导致了系统崩溃,这样才能有针对性的进行改正. 本文描述了自己总结的几种定位崩溃的办法.

【转载】C++程序崩溃排查方法

windows下C++程序release版本崩溃错误排查方法. 一个你精心设计的24小时不间断运行,多线程的程序,突然运行了几个月后崩了,此问题是非常难以排查的,也是很头疼的问题. 现利用Google开源工具crashrpt与Microsoft windbg工具,解决这个问题,并分享给大家. 使用工具Crashrpt.Windbg.因为windbg这个工具很常见,暂不介绍.其中重点介绍一下crashrpt. 一.crashrpt 简介 crashrpt是一个包含能够在程序出现各种类型未处理异常时

【转】程序崩溃时自动记录minidump的c++类

原帖:程序崩溃时自动记录minidump的c++类 封装了一个C++类,当程序意外崩溃的时候可以生成dump文件,以便确定错误原因. 头文件: //crash_dumper_w32.h #ifndef _CRASH_DUMPER_H_ #define _CRASH_DUMPER_H_ #include <windows.h> class CrashDumper { public: CrashDumper(); ~CrashDumper(); static bool _PlaceHolder()

VEH帮你定位程序崩溃地址

之前朋友有一个服务端程序,总是受到一些人的恶意漏洞攻击,没有源代码,只好反汇编修复了漏洞,并且使用WinLicense加保护授权. 漏洞总不是一次可以修复完的,恶意攻击并没有停止,然后加了WL保护程序在崩溃的时候在没有提示信息,服务器日志中也没有记录任何有用的信息了,这里所需要有用的信息即是崩溃时候汇编代码运行的内存地址.c++写的程序崩溃的时候我们经常可以看到这种包含了运行址,以及访问内存地址相关信息的对话框. 首先想到的办法是使用windbg的adplus -crash dump内存分析,c

如何防止程序崩溃

//程序崩溃规避 //Windows1.设置编译器"Enable C++ Exceptions"为"/EHa",即"Yes with SEH Exceptions", 使得应用程序可以捕获因自身引起的大部分系统异常,少部分不可回避的系统异常依然 会导致程序崩溃退出:2.用"try{}catch(...){}"包裹可能会发生崩溃(越界.段错误.除零等操作)的代码段, 在catch中处理异常. * 高版本VC提供_set_inva

如何防止后台线程抛出的异常让程序崩溃退出

原文:如何防止后台线程抛出的异常让程序崩溃退出 如果你的程序抛了异常,你是怎么处理的呢?等待程序崩溃退出?还是进行补救? 如果是做 UI 开发,很容易就找到 Dispatcher.UnhandledException 事件,然后在事件中进行补救.如果补救成功,可以设置 e.Handled = true 来阻止异常继续让程序崩溃退出.但是,如果是后台线程抛出了异常呢?并没有 Dispatcher 可以用.所以我们就束手就擒让程序自己退出吗? WPF 和 Windows Forms 都是微软的框架,

QSqlQuery 可以让你的程序崩溃

linux平台下. 一个程序总是运行个两三天,或者一两天的时候突然崩溃了,以前发过一个讨论但是也没找到解决办法,使用的数据库是SQLITE 使用GDB跟踪程序,结果找到了崩溃的地方却显示栈被破坏显示不出调用的具体方法,运行了好几次都是这样.定位到了 __memmove_ssse3在libc里面. 为了恢复完整的栈信息在国外大牛那里找来两句话 (gdb)set $pc=*(void **)$esp (gdb)set $esp=$esp+4 执行完就可以查看堆栈了(32位平台).注意这个不能由cor