当前位置:  开发笔记 > 编程语言 > 正文

如何构建一个捕获所有异常的C++ Dll包装器?

如何解决《如何构建一个捕获所有异常的C++Dll包装器?》经验,为你挑选了2个好方法。

就像标题所说,我们正在寻找一种方法来捕获一段C++代码中的所有异常,并将其包装在一个DLL中.这样我们可以屏蔽使用此dll的应用程序,从此dll中发生的任何错误.

但是,在Windows下使用C++似乎不太可行.

例:

void function()
{  
    try  
    {    
        std::list::iterator fd_it;
        fd_it++;  
    } catch(...) {}
}

发生的异常不是由标准C++ try/catch块捕获的,也不是由设置的任何SEH转换器函数捕获的_set_se_translator().相反,DLL崩溃,并且使用DLL的程序被中止.我们使用Visual C++ 2005编译,使用选项/ SHa.有谁知道在C++/Win32中是否可以捕获这些问题并制作一个rockolid DLL包装器?



1> bk1e..:

制作坚如磐石的DLL包装器的唯一方法是将错误的DLL加载到另一个进程中,这样如果它崩溃了,它就不会让你的主进程失效.

捕获所有C++异常似乎是合理的,但捕获所有结构化异常是另一回事.SEH 似乎可以让你在那里大部分时间,因为它允许你捕获访问冲突,被零除异常等.

但是,如果有错误的DLL碰巧从另一个线程的堆栈触及一个未提交的页面怎么办?内存访问将页面错误,异常处理程序将被调用,现在该页面不再是一个保护页面.当该线程需要增加堆栈时,它将获得访问冲突,并且该进程将崩溃.(这些 帖子更详细地描述了这个案例.)

另一个可能的问题:错误的DLL在持有同步对象时崩溃,但您使用SEH来捕获异常.如果您的进程尝试获取相同的同步对象,则它会死锁而不是崩溃.共享同步对象可能是C运行时或操作系统的一部分:如果有错误的DLL 1加载有错误的DLL 2,如果有错误的DLL 1 DllMain()持有加载程序锁,它会崩溃?下次加载DLL时你的进程是否会死锁?

有关为何(以及IsBadReadPtr()具有类似问题的功能)滥用SEH的原因的更多信息:

Larry Osterman的WebLog:结构化异常处理被认为是有害的

Larry Osterman的WebLog:我应该检查我的功能参数吗?

Larry Osterman的WebLog:弹性不一定是好事

Old New Thing:IsBadXxxPtr应该被称为CrashProgramRandomly



2> JaredPar..:

在Windows上,C++有两种不同的异常样式:C++和SEH异常.

SEH是一种仅限Windows的异常形式(有点类似于UNIX中的信号).这更像是系统级异常.它们将被抛出进行无效指针访问,对齐问题等操作......

如果你想捕获Windows上的C++应用程序可以抛出的每个异常,你需要同时捕获它们.幸运的是,有一种方法可以混合使用C++和SEH异常.我最近写了一篇关于此的详细博客文章,它应该会帮助你.

http://blogs.msdn.com/jaredpar/archive/2008/01/11/mixing-seh-and-c-exceptions.aspx

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有