问题标签 [structured-exception]
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.
windows - 在展开期间在 Windows x64 上恢复 SIMD 寄存器
在 Windows x86-64 上,如何在展开期间恢复被调用方保存的 SIMD 寄存器?如果一个人正在编写汇编代码,如何确保这正确发生?
exception-handling - .seh_stackalloc 和堆栈对齐
我正在为 GNU 汇编器编写一些 x64 程序集。我一直在尝试阅读有关 .seh_* 指令的信息,但我没有找到关于它们的太多信息。gas
文档根本没有提到它们。
但据我了解,如果我的代码在 SEH 展开操作期间可能在堆栈中,我应该使用这些。而且由于我的代码会进行堆栈操作并调用其他函数,因此 SEH 是可能的,所以我应该使用这些。
大多数情况下,我认为我做对了:
但是有一点不清楚。我有这个指令:
我到底如何告诉 SEH 我正在执行堆栈对齐?这可能会将堆栈从 15 个字节(非常不可能)到 8 个字节(很可能)再到 0 个字节(当然可能)调整。由于实际金额可能要到运行时才能确定,所以我被卡住了。
我想我可以跳过 .seh 指令,但是如果确实在那里保留了 8 个字节的堆栈,我可能已经破坏了展开,不是吗?这不是破坏了这里的全部目的吗?
或者,我可以省略对齐。但是如果我调用其他函数(比如 memcpy),我不应该对齐堆栈吗?根据女士:
堆栈将始终保持 16 字节对齐,序言内除外
也许我可以通过这个“推理”我的方式?如果打电话给我的人做对了(如果...),那么当他做call
. 我可以依赖这个吗?看起来很脆弱。
我试过查看其他代码,但我不确定我是否相信我所看到的。我怀疑gas
报告误用 .seh_* 的错误。您可能只会在实际异常期间看到问题(甚至可能并非总是如此)。
如果我要这样做,我想把它做对。看起来堆栈对齐是一件很常见的事情,所以这里必须有人有解决方案。我只是没看到。
winapi - 在 WIN32 和 WIN64 中配置浮点单元上下文
我正在尝试编写一个未处理的异常过滤器(请参阅 SetUnhandledExceptionFilter())以与 Windows SEH 一起使用以报告无效的浮点操作。我想捕获异常,打印堆栈跟踪,然后禁用浮点异常并使用生成的非有限或非数字值恢复执行。
我编写了下面的简单程序来演示捕获异常并恢复执行的能力。注意#ifdef _WIN64 的使用,因为 ContextRecord 的定义根据目标体系结构而变化(WIN32 使用“FloatSave”,WIN64 使用“FltSave”)。
当作为 WIN32 .exe 运行时,上述程序按预期运行,输出:
但是,当以 WIN64 .exe 运行时,程序进入死循环,不断重新捕获浮点异常:
这似乎表明我没有成功配置浮点单元,我想这与 WIN32 和 WIN64 之间 ContextRecord 的不同定义有关,但我还没有找到任何好的相关文档来确切说明如何设置浮点上下文。
关于如何正确设置 WIN64 的浮点上下文的任何想法?
提前致谢
floating-point - 处理异常后恢复上下文仅适用于启用 VS /RTC(运行时检查)
我的最终目标是提供一种方法来捕获浮点异常,打印堆栈跟踪,并在禁用浮点异常的情况下恢复执行(使用生成的非有限/非数字值)。自从我最初的问题以来,我已经取得了一些进展,我意识到在使用 SSE(x64 中的默认值)时需要调整更多寄存器以清除/配置浮点单元。
我确实得到了一个非常简单的示例,但是一旦我进入发布版本,x64 的情况就会崩溃。Debug/Release build 针对 x86 目标运行良好。我已将问题缩小到Visual-Studio 的“运行时检查”选项,特别是 RTC,它“启用堆栈帧运行时错误检查”。
这是示例程序:
启用 RTC 后,此代码会创建输出(这是我所期望的):
禁用 RTC 后,此代码将创建输出:
所以,总结一下:
针对 x86 目标 (WIN32):调试或发布版本都没有问题!
针对 x64 目标 (WIN64):仅当 RTC 禁用时,尝试从浮点异常中恢复后才会发生访问冲突。
关于 RTC 的作用以及为什么它会影响从浮点异常中恢复的行为有什么想法吗?
编辑:我在汇编中对此进行了进一步的调试。违规发生在从过滤器函数返回之后,但在除以零之前恢复。下面是导致访问冲突的程序集(程序集的最后一行是罪魁祸首):
“rcx”的调试器中的值为0x30e340,Visual Studio中的异常消息为:“fptest.exe中0x7711b519处的第一次机会异常:0xC0000005:访问冲突读取位置0xffffffffffffffff。”
为什么 VS 会报告它正在尝试读取 0xffffffffffffffff?
c++ - 如何判断我正在运行的 Microsoft C++ 代码是否使用 /EHa 开关编译?
我需要确保我使用的头文件是用 /EHa 编译器开关编译的?
我怎样才能做到这一点?
c++ - 错误 C2712 不能在需要对象展开的函数中使用 __try
我正在编写一个简单的 C++ WIN32 API 程序来安装和启动 Windows 服务。我在我的代码中使用 SEH __try&__finaly。不幸的是,我收到了一个已知错误,如下所示:
error C2712 Cannot use __try in functions that require object unwinding.
我尝试使用一些熟悉的方法来解决它,例如将 SEH 代码从主函数移动到另一个函数,或者使用项目属性播放错误:启用 C++ 异常。但没有任何效果。无论如何,这是来源:
windows - 捕获未处理的异常后允许什么
为了在 Windows 上编写故障转储,我正在捕获未处理的异常,所有这些都使用SetUnhandledExceptionFilter
和MiniDumpWriteDump
现在这个工作(尽可能好)但我的问题是,一旦我进入我的异常过滤器功能,我可以做什么?
理论上我还能分配新资源、在我的硬盘上写东西、启动其他进程等吗?我基本上知道我的应用程序崩溃了,但这是否会对一旦发生这种情况可以做什么施加任何限制?我必须记住什么?
c++ - EXCEPTION_RECORD 在什么情况下会链接到另一个嵌套异常?
的文档_EXCEPTION_RECORD
说它的一个成员,struct _EXCEPTION_RECORD *ExceptionRecord
指向关联的 EXCEPTION_RECORD 结构的指针。异常记录可以链接在一起,以便在发生嵌套异常时提供附加信息。
但是,我还没有能够引发嵌套结构化异常的这种情况。这是我到目前为止所尝试的:
pex->ExceptionRecord->ExceptionRecord
总是nullptr
。_ 在什么情况下我会得到一个嵌套_EXCEPTION_RECORD
在那里的链接?
c++ - SEH Eceptions - 生成和处理
我想生成和处理异常(SEH)。
如何编写会导致“非法指令”异常的代码?