gpt4 book ai didi

exception - 捕捉导出(1);

转载 作者:行者123 更新时间:2023-12-03 17:21:46 24 4
gpt4 key购买 nike

我有一个 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(“遇到错误!”)”,并且我的全局异常处理程序可以捕获它。
3. 我尝试在我的 MFC 应用程序中使用 atexit(),借此我注册另一个函数以在 DLL 调用 exit() 时抛出错误。但这似乎不起作用。

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

谢谢。

最佳答案

检查 DLL 的符号导入表。

您可能只能在运行时将其重新映射到您选择的函数。

怎么做(假设有导出):

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

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

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

哦,你不能从 exit() 返回。你必须跳远。

关于exception - 捕捉导出(1);,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/623353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com