【发布时间】:2013-06-06 15:08:54
【问题描述】:
我创建了一个内存管理器,它分配由具有 PAGE_NOACCESS 保护的两个页面包围的内存。 我在 SEH 块中调用一个使用该内存的函数,并捕获在该块中发生的 ACCESS_VIOLATION 异常(如果有)。现在,在我的异常处理程序中,是否可以检索程序无权访问的地址?我知道您可以获得指向错误指令的指针,但是您必须实际解析程序集?
这是为了让我知道违规是在我的受保护内存中引起的(我可以从中继续执行;这可能是预期的行为),或者它是否是另一个(未知)地方,我可能不得不从中终止过程。 我考虑过使用 PAGE_GUARD 保护,这将帮助我确定访问的内存可能来自我的受保护内存,但不确定(即堆栈后的内存受 PAGE_GUARD afaik 保护)。
任何帮助表示赞赏:)
【问题讨论】:
-
这真的很狡猾。如果你的代码访问了无效的内存,那就是错误的,需要修复,而不是“处理”。
-
听起来有点像你在问一个 XY 问题。你到底想做什么?
-
我的代码没有。我正在尝试从外部“沙箱化”代码,并确保它不会失败(程序不得崩溃,除非完全不可避免)。
-
@MatsPetersson 我试图找到正在访问的地址并引发了异常。如果我知道访问的地址是从内存管理器分配的,我可以安全地继续执行(从另一个点)。
-
@MatsPetersson 沙盒代码是托管的,可以“注册”和取消注册。如果异常被捕获并且我处理了它,我会禁用代码,只要我能保证被颠簸的内存只是我分配的(这就是我在分配的内存周围放置保护页的原因)。我不会在错误代码中继续执行。之后它会清理状态,并且不会再次调用错误代码。
标签: c++ windows memory-management seh