问题标签 [seh]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4475 浏览

node.js - 进程内存不足时如何处理V8引擎崩溃

节点控制台和基于 Qt5 的 V8都QJSEngine可以通过以下代码崩溃:

节点崩溃前的输出:

QJSEngine崩溃前的输出:

如果我在调试器下运行我的QJSEngine测试应用程序(见下文),它会v8::internal::OS::DebugBreak在 V8 代码中显示调用。如果我将调用代码包装QJSEngine::evaluate__try-__except( SEH ) 中,则应用程序不会崩溃,但此解决方案是特定于 Windows 的。

问题:有没有v8::internal::OS::DebugBreak办法在节点和 Qt 应用程序中以独立于平台的方式进行处理?

=== QJSEngine 测试代码 ===

开发环境:带有 Qt5 和 Windows SDK 7.1 的 QtCreator,在 Windows XP SP3 上

QJSEngineTest.pro:

没有 SEH 的 main.cpp(这会崩溃):

带有 SEH 的 main.cpp(这不会崩溃,输出“致命异常”):

0 投票
1 回答
1110 浏览

c++ - 通过 SEH 处理访问冲突

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

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

任何帮助表示赞赏:)

0 投票
1 回答
100 浏览

winapi - 从 ExceptionCode 获取描述

是否有用于将 ExceptionRecord 中的 ExceptionCode:s 转换为可读消息(如 FormatMessage)的 API,以解决常规错误。

0 投票
3 回答
677 浏览

assembly - WinPhone8 是否完全支持 ARM(不是 Thumb)?

我面临一个奇怪的问题,有点类似于this。我有一个 Windows Phone 8 本机 DLL 项目,主要是 C++,但其中包含 ARM 程序集源。源处于 ARM 模式(即不是 Thumb)。C++ 编译为 Thumb。

当 C++ 尝试调用汇编例程时,应用程序崩溃。反汇编中的调用命令是带有立即偏移量的 BLX - 它应该无条件地将模式切换回 ARM,但不知何故它没有。

我有异常的详细信息。异常代码为0xc000001d(无效操作),crash context struct中PC的值为0x696d5985。这在任何一种模式下都是不可能的——它没有对齐,零位是一。BLX 指令运行1b f0 0c eb- 如果您破译,那是一个由两部分组成的 Thumb 式 BLX 好吧,具有 4 对齐位移。崩溃上下文中的 T 标志为 SET (CPSR=0x60000010)。

我没有设备,但来自 beta 测试人员的崩溃日志非常有说服力。在调用程序集之前我有一个调试日志记录。然后是崩溃。

编辑:相关。然而,他们声称汇编程序本身 ( armasm) 将 ARM 转换为 Thumb。对我来说不是这样——至少不是静态的。DLL 包含正确的 ARM 代码,如汇编源代码 ( CODE32) 中所指定。

编辑:尝试使用稍微不同的跳转顺序:

结果相同。看起来商店中某处发生了一些奇怪的代码变形,或者操作系统本身捕获了模式切换并阻止了它们。

代码变形可以通过将可执行文件的一部分连同其余的崩溃数据一起转储到崩溃日志中来检测。但是,除了将整个代码库转换为 Thumb 之外,我还能如何处理操作系统干扰?它不只是重新编译。

为 dwelch 编辑:编译的 C 代码中的调用序列如下所示:

BLX 到立即地址有切换模式。这不是有条件的,例如bx register. 调用目标是一个 thunk:

崩溃地址是这个 thunk 加一:5985。

这是已编译 DLL 的反汇编,但我不能保证这正是设备上正在执行的内容。链接的 MSDN 线程中的用户声称他们查看了调试器中的反汇编并看到了 ARM 应该在的地方。微软, IIRC,拥有修改从发布者到设备的应用程序代码的专利;这可能是原因。

0 投票
3 回答
5283 浏览

c++ - 如何防止编译器优化加载到从未使用过的变量

简介:我试图快速修复旧代码并使用 __try MSVC 扩展来检查某些 ptr 是否指向某些合法内存或 *ptr 是否会导致内存冲突(如果是这样,我会放弃对该 ptr 的处理)。所以我写了类似的东西:

问题是我强制访问内存的解决方案看起来很奇怪,很难看,而且我不确定它是否正确。另外请不要我不能禁用整个项目的优化,所以这不是一个选项。MSDN 上的编译指示优化文档很糟糕,也就是说,不清楚“”是否禁用了该函数的所有优化。

0 投票
0 回答
364 浏览

c++ - 如何从 EXCEPTION_RECORD 中获取加载失败的文件名?

我注册了向量异常处理程序。使用这篇文章,我设法从 EXCEPTION_POINTERS 结构中获取对象的名称pExceptionInfo

我得到的对象名称是.PAVEEFileLoadException@@. 因此,据我了解,它无法加载某种文件。有没有办法从 EXCEPTION_RECORD 或任何其他结构中获取文件名?

0 投票
0 回答
567 浏览

buffer-overflow - 基于 SEH 的漏洞利用如何绕过 DEP 和 ASLR?

我是基于 SEH 的漏洞利用的新手

为什么我们不直接将返回地址放在 SE 处理程序中以跳转到我们的 shellcode?(没有安全SEH)

没有人能解释使用pop pop ret的原因吗?

我读到一些说 SEH 绕过 ASLR 和 DEP 的东西,但是怎么做呢?

我们的shellcode最终将位于堆栈中并且堆栈仍然不可执行,如何绕过DEP?

0 投票
1 回答
215 浏览

debugging - WP 8 应用程序在本机模式调试(发布模式)下运行良好,但在没有调试器的情况下崩溃

有问题的应用程序同时使用本机代码和托管代码。托管代码仅提供 UI 层,同时它与执行大量操作的本机 dll 链接。本机 dll 与其他一些静态 dll 链接。现在的问题是,当我运行应用程序时,它会不确定地崩溃。当我在托管代码调试下调试应用程序时,它显示本机代码中的特定函数引发了“SEH”异常。堆栈跟踪仅显示当前函数。我在 SEH 异常中得到的错误代码是 EFAIL。但是,该应用程序每次在本机调试器下都运行良好。引发 SEH 异常的函数是单线程的。它不使用可以在任何其他线程中访问的任何资源。这种行为的可能原因是什么?我应该如何在本机代码中检测异常的来源。

我正在使用视觉工作室 2012。

0 投票
1 回答
1226 浏览

c++ - __try 和 __except 在发布版本中不起作用

在我的程序中,我确实需要使用 SEH 异常处理程序,它可以捕获 AccessViolation 等错误,但处理程序仅在 Debug 构建中工作。

我在发布版本中启用了相同的选项,但它不起作用。

无论如何如何在发布模式下启用 SEH?

谢谢!

在 Debug 构建模式下工作,但不能在 Release(崩溃)下工作。

0 投票
1 回答
329 浏览

c - Exception Handler not called in C

I am reading about Structured Exception Handling in C. Here is an example code which does not work as expected:

This code is taken from here:

http://msdn.microsoft.com/en-us/library/ha52ak6a.aspx

This code should print the message, "Hello from my_handler" when the exception is triggered by trying to write to an invalid memory address. However, it appears that the exception handler is not called at all.

I compiled this code and tried debugging it with Olly Debugger. When the exception occurs, I try passing the exception to the application defined exception handler (by pressing, Shift + F9) but it does not get called. I set a breakpoint at the exception handler (first instruction), but it never reaches that section of code.

What might be the reason for this?