VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 928|回复: 6

[求助] win8 不能用SetUnhandledExceptionFilter 么

[复制链接]
47_avatar_middle
在线会员 发表于 2015-11-18 14:03:41 | 显示全部楼层 |阅读模式
3驿站币
设置异常函数 SetUnhandledExceptionFilter 在vs2013 win8 下没有运行,代码如下

// dumptest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

// 处理Unhandled Exception的回调函数  
//  
LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
        // 这里弹出一个错误对话框并退出程序  
        //  
        FatalAppExit(-1, _T("*** Unhandled Exception! ***"));

        return EXCEPTION_EXECUTE_HANDLER;
}



class CrashTest
{
public:
        void Test()
        {
                Crash();
        }

private:
        void Crash()
        {
                // 除零,人为的使程序崩溃  
                //  
                int i = 13;
                int j = 0;
                int m = i / j;
        }
};


int _tmain(int argc, _TCHAR* argv[])
{
        SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
        CrashTest test;
        test.Test();
        return 0;
}


按照正常的 ,除以0是异常应该执行  FatalAppExit(-1, _T("*** Unhandled Exception! ***"));  但是没有,网上说可能debug抢先了,但是release也不行,是win8 本身不支持还是其他什么原因,因为我现在程序不定时的异常,找不到问题,想用这个捕获异常,并写入dump文件找原因,但是貌似这个异常不执行,各位群友谁用过熟悉的
  





上一篇:内联函数的一点小疑问
下一篇:网络高手指点(接上贴)
51_avatar_middle
online_admins 发表于 2015-11-18 14:25:57 | 显示全部楼层
除数为 0 这种异常之前记得试过,确实捕获不到,不是你 Win8 系统的问题,可以直接用 if 判断吧
47_avatar_middle
ico_lz  楼主| 发表于 2015-11-18 18:19:57 | 显示全部楼层
不是,主要是要生成dump分析bug,一个很奇怪的bug,不是每次都出现,有时候会,不好调试,linux有这种coredump,想在windows下面也找个类似的东西,这个函数应该可以的,我的程序不是除以0 ,但是也捕获不到, syc 有没有能捕获异常的代码,我看看,还有,或者有什么其他代替方法,能分析的更准确些的,
24_avatar_middle
在线会员 发表于 2015-11-20 10:03:16 | 显示全部楼层
用windbg 吧
47_avatar_middle
ico_lz  楼主| 发表于 2015-11-29 00:04:22 | 显示全部楼层
我是要用这个函数捕获程序的异常,windbug能融合到程序里面么?
53_avatar_middle
在线会员 发表于 2016-1-13 00:11:49 | 显示全部楼层
本帖最后由 xieglt 于 2016-1-13 00:13 编辑

给你几个建议。
一、把这个函数 LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)

修改成 long _stdcall ApplicationCrashHandler(EXCEPTION_POINTERS *pException) 试试,

c 函数 与 pascal 的传参方式和返回方式都不一样,这个函数原型是pascal 方式,你定义的是 c 方式,虽然强制转换了,但不知道有没有影响。

二、在 函数void Crash() 里试试一下触发别的异常,看能不能触发,比如
      
       断点:
     _asm
       {
           int 3
        }
      
       单步:
       _asm
     {
          int 1
      }
      
      非法内存访问:
      char * p = NULL;
      p[0] = 'a';

三,在void Crash() 里加几个messagebox 看一下。

  void Crash()
        {
               AfxMessageBox("entry");
                int i = 13;
                int j = 0;
                int m = i / j;
                AfxMessageBox("leave");
        }

如果找不出问题,那可能就是win8已经不支持结构化异常处理了。
53_avatar_middle
在线会员 发表于 2016-1-13 00:21:29 | 显示全部楼层
我有一个程序里也经常遇到除0错误,但是我记得是可以捕捉得到的,不过我的系统是很老的win2000和winxp

后来修改这个程序,把每个变量除数都做除0判断

#define I_ZEOR_CHECK(n)   ((n==0) ?  1:n)

原来程序的 除法都是用的  '/'
查找起来超级麻烦。能找个无数的 '/'

后来学乖了,凡是除法和取余都改成宏

#define  DIV(a,b)    (a/b)
#define  MOD(a,b)   (a%b)
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-19 23:45

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表