加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

例外 – 赶上出口(1);

发布时间:2020-12-14 02:18:31 所属栏目:Windows 来源:网络整理
导读:我有一个MFC SDI应用程序,它在启动期间加载DLL.我只能查看源代码并使用DLL但不能更改重新编译它. 现在的情况是,每当DLL引发错误时,它将调用exit(),如下所示. bool Func(){ // .. do something here if (error) { exit(999); }} 在我的MFC应用程序中,我设置了
我有一个MFC SDI应用程序,它在启动期间加载DLL.我只能查看源代码并使用DLL但不能更改&重新编译它.

现在的情况是,每当DLL引发错误时,它将调用exit(),如下所示.

bool Func()
{
  // .. do something here

  if (error) { exit(999); }
}

在我的MFC应用程序中,我设置了SetUnhandledExceptionFilter来处理所有异常,并创建了一个MiniDump用于调试目的.

所以现在的问题是,每当DLL遇到任何错误时,它只会调用状态代码为999的exit(),而我的ExceptionFilter将无法捕获它,因此没有为PostMortem调试创建MiniDump.

我很想知道:
1.我的全局异常处理程序有没有其他方法来捕获它?
2.我可以覆盖exit()函数,以便在调用时,我调用“throw(”error encounter!“)”并且我的全局异常处理程序可以捕获它.
3.我尝试在我的MFC应用程序中使用atexit(),每当DLL调用exit()时,我都会注册另一个函数来抛出错误.但似乎这种方式效果不佳.

我真正想做的是,每当DLL遇到错误时,我都希望生成一个MiniDump,这样我就可以进行PostMortem调试.还有什么可能在这种情况下有效吗?

谢谢.

解决方法

检查DLL的符号导入表.

您可能只能在运行时将其重新映射到您选择的功能.

怎么做(假设退出那里):

大多数DLL通过跳转表使用符号导入.如果在调用者上设置断点,您将看到它调用了一个长跳转指令.跳转表是PAGE_EXECUTE_READWRITE页面,因此您可以使用自己的地址覆盖跳转表的那个插槽.

跳转表的位置会有所不同,但它始终是加载地址的常量偏移量,因此是任何函数指针到GetProcAddress找到的DLL的常量偏移量.

当然,所有这些都假设DLL永远不会改变.可能有一种方法可以在运行时找到所有这些东西,但我不知道你会怎么做.

哦,你不能从exit()返回.你必须长时间跳出来.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读