VC6 MFC程序如何捕获程序闪退?

xinhaoda 2017-05-26 05:18:39
程序中有资源是独占方式,一旦程序闪退无法释放,导致必须重启PC,软件才能正常使用。
需求是:如何捕获闪退异常,在异常中释放该资源。 谢谢!
...全文
811 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-05-31
  • 打赏
  • 举报
回复
引用 7 楼 xinhaoda 的回复:
赵老师,您的意思是,避免一切动态分配,避免闪退的根源,自然不用担心这个事情的发生喽?
我的意思是:不要把精力浪费在优雅地退出上,因为这是不可能做到的;而要把精力倾注到在任何情况下都能正常重启上。
赵4老师 2017-05-27
  • 打赏
  • 举报
回复
xinhaoda 2017-05-27
  • 打赏
  • 举报
回复
3楼,我们这个程序在VC6下完成的,CrashRpt可以在VC6下使用吗?
xinhaoda 2017-05-27
  • 打赏
  • 举报
回复
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler); 程序中已经加过这个东西产生Dmp。 但是闪退会进这个回调吗?确定吗?
时间不多了ccc 2017-05-27
  • 打赏
  • 举报
回复
要是UI的问题用Spy++,看最后捕获的是哪些消息。
时间不多了ccc 2017-05-27
  • 打赏
  • 举报
回复
使用CrashRpt,看看dump出来的信息。
大树学长 2017-05-27
  • 打赏
  • 举报
回复
system("pause");
xinhaoda 2017-05-27
  • 打赏
  • 举报
回复
比如参数无效的异常,运行时库中直接调用SetUnhandledExceptionFilter将Filter函数置空了,所以你之前设置的Filter被清除了,所以你就捕获不到了! -----你是说其它库调用了SetUnhandledExceptionFilter把软件的Filter置空了,所以就没有捕获到,因此Dmp文件就为空了?
dvlinker 2017-05-27
  • 打赏
  • 举报
回复
引用 9 楼 chenlycly 的回复:
比如参数无效的异常,运行时库中直接调用SetUnhandledExceptionFilter将Filter函数置空了,所以你之前设置的Filter被清除了,所以你就捕获不到了!
使用微软的research项目detours直接hook UnhandledExceptionFilter函数,就能这类异常捕获到!
dvlinker 2017-05-27
  • 打赏
  • 举报
回复
比如参数无效的异常,运行时库中直接调用SetUnhandledExceptionFilter将Filter函数置空了,所以你之前设置的Filter被清除了,所以你就捕获不到了!
dvlinker 2017-05-27
  • 打赏
  • 举报
回复
引用 2 楼 arosey 的回复:
使用CrashRpt,看看dump出来的信息。
对的,使用crashrpt可以捕获,但是可能有写情况捕获不到,需要使用微软的research项目detours直接hook UnhandledExceptionFilter函数。
xinhaoda 2017-05-27
  • 打赏
  • 举报
回复
赵老师,您的意思是,避免一切动态分配,避免闪退的根源,自然不用担心这个事情的发生喽?
Rockismej 2017-05-26
  • 打赏
  • 举报
回复
PTOP_LEVEL_EXCEPTION_FILTER
WINAPI
SetUnhandledExceptionFilter(
    __in_opt LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
    );
由MSDN我们可以知道:当前进程中发送任何异常时,SetUnhandledExceptionFilter都能捕获到,并将调用lpTopLevelExceptionFilter回调函数。
所以在异常发送时 我们可以在lpTopLevelExceptionFilter中做我们想做的事

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧