【问题标题】:Handling access violations through SEH通过 SEH 处理访问冲突
【发布时间】:2013-06-06 15:08:54
【问题描述】:

我创建了一个内存管理器,它分配由具有 PAGE_NOACCESS 保护的两个页面包围的内存。 我在 SEH 块中调用一个使用该内存的函数,并捕获在该块中发生的 ACCESS_VIOLATION 异常(如果有)。现在,在我的异常处理程序中,是否可以检索程序无权访问的地址?我知道您可以获得指向错误指令的指针,但是您必须实际解析程序集?

这是为了让我知道违规是在我的受保护内存中引起的(我可以从中继续执行;这可能是预期的行为),或者它是否是另一个(未知)地方,我可能不得不从中终止过程。 我考虑过使用 PAGE_GUARD 保护,这将帮助我确定访问的内存可能来自我的受保护内存,但不确定(即堆栈后的内存受 PAGE_GUARD afaik 保护)。

任何帮助表示赞赏:)

【问题讨论】:

  • 这真的很狡猾。如果你的代码访问了无效的内存,那就是错误的,需要修复,而不是“处理”。
  • 听起来有点像你在问一个 XY 问题。你到底想做什么?
  • 我的代码没有。我正在尝试从外部“沙箱化”代码,并确保它不会失败(程序不得崩溃,除非完全不可避免)。
  • @MatsPetersson 我试图找到正在访问的地址并引发了异常。如果我知道访问的地址是从内存管理器分配的,我可以安全地继续执行(从另一个点)。
  • @MatsPetersson 沙盒代码是托管的,可以“注册”和取消注册。如果异常被捕获并且我处理了它,我会禁用代码,只要我能保证被颠簸的内存只是我分配的(这就是我在分配的内存周围放置保护页的原因)。我不会在错误代码中继续执行。之后它会清理状态,并且不会再次调用错误代码。

标签: c++ windows memory-management seh


【解决方案1】:

根据the EXCEPTION_RECORD documentation,尝试的地址存储在ExceptionInformation[1] 中。

【讨论】:

  • 谢谢伙计。希望我没有用我的非正统代码侮辱你:)
  • 我仍然不相信你的方法是正确的,但这就是我评论它的原因。你的问题的答案还是一样的,但似乎有点狡猾。
  • 问题是我被托管并且我也托管代码。即使我的托管代码有问题,我也不能破坏主机。这只是与我的程序相关的风险,第一次使用时会弹出一个很大的免责声明:如果你使用这个程序,所有的赌注都会被取消。但是如果你正确使用它,它会很棒(imo :P)。
  • 是的,这还不错,遗憾的是,由于性能要求和接待方式,我无法享受这些奢侈品。
猜你喜欢
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
相关资源
最近更新 更多