问题标签 [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 投票
0 回答
319 浏览

c# - 通过包装器在 c# 中使用 NLOpt(一个 c++ 库)时出现 SEHException

我通过这个包装器在 c# 中使用优化库(NLOpt,为 c++ 编写):

https://github.com/roryclune/NLOptDotNet

当向问题添加超过 15 个约束时,我得到一个 SEHException。通过将 FunctionDelegate 传递给求解器来添加约束。

这是异常堆栈跟踪: System.Runtime.InteropServices.SEHException (0x80004005):外部组件已引发异常。在 _CxxThrowException(Void* , s _ThrowInfo* ) 在 nlopt.opt.mythrow(opt* , nlopt_result ret) 在 nlopt.opt.add_equality_constraint(opt* , IntPtr vf, Void* f_data, Double tol) 在 NLOptDotNet.NLOptWrapper.AddFunction( FunctionType ftype, FunctionDelegate funcDelegate, Object data, Double tol)

我是否遗漏了某些东西,或者它一定是包装器\库中的错误?这是代码,我在 --->>> 行得到了异常:

0 投票
0 回答
155 浏览

freepascal - 保存/恢复线程本地存储

我正在尝试在 FreePascal 中使用w32 光纤 API来实现协程类。到目前为止,我可以分配工作上下文 (CreateFiber) 并在上下文之间切换 (SwitchToFiber)。

但是我无法让异常可靠地工作。在不同的上下文中应该有不同的异常链。当使用 w32 SEH 异常处理链时,链切换会在 SwitchToFiber 中自动发生。但是 FreePascal 不使用 w32 SEH 链,而是将自己的链存储在 threadvar 中。

我想继续尝试手动保存/恢复线程变量。到目前为止,我可以获得 ThreadEnvironmentBlock 结构:

我相信线程变量存储在 ThreadLocalStorage 中,它位于 ThreadEnvironmentBlock 内的某个位置;-) 现在我想正确保存和恢复 ThreadLocalStorage。需要以下信息:

  1. ThreadEnvironmentBlock 线程变量存储在哪里?
  2. 如何将它们保存/存储到全局堆中/从全局堆中保存?
0 投票
1 回答
2866 浏览

winapi - Win32 GUARD 内存:如何使用 PAGE_GUARD 实现堆栈

我正在编写一个微小的字节码、解释语言(或框架?vm?)。我知道 WindowsPAGE_GUARD在堆栈上使用,我想使用它。

首先,我保留虚拟内存并在一页上执行 MEM_COMMIT/PAGE_GUARD。

(我知道我应该提交(非 PAGE_GUARD)一页,但这是为了测试PAGE_GUARD。)

我写__except如下:

(我也知道我应该提交/保护下一页,但这也是为了测试。)

当我触摸堆栈的内存时,STATUS_GUARD_PAGE_VIOLATION就会发生。但在那之后,/* A */运行;

PAGE_GUARD发生异常后Windows不会取消标记吗?为什么这段代码不能很好地工作?


而且,我不知道如何做这部分:(我也知道我应该提交/保护下一页,但这也是为了测试。)。我能怎么做?我想我应该 1. 获取受保护页面的地址 2. 提交/保护下一页,但我不知道该怎么做 1.

编辑:我知道该怎么做 1. 受保护的地址在这里:

感谢你的帮助!

0 投票
1 回答
858 浏览

exception-handling - SEH 处理程序导致编译器警告和错误

我在我的代码中使用了 SEH 处理程序,如下所示:

但得到以下编译器错误:

0 投票
1 回答
485 浏览

c++ - 编写 SEH 翻译器

现在,我在构造函数中做什么?我找不到任何关于*se_info存在多久的信息,这意味着我可能不应该只是保存se_info在私有字段中以备后用——我应该深入复制它。或者可能不是?

怎么回事what()?我应该按需变出底层字符串吗?同样,在这种情况下,在构造函数中分配内存似乎不是一个好主意。

我目前已经实现了它存储se_code并且se_info没有任何深度复制,并在构造函数中生成格式化消息,并且它可以工作,尽管我不知道它是否真的应该工作。

我打算在“捕获,记录发生的事情,终止”场景中使用它。

0 投票
2 回答
1495 浏览

c++ - SEH StackOverflow 异常 - 真的无法捕捉吗?

我读过很多关于SEH exceptionsStackOverflow 和 CodeProject.net 的文章。

在我的 C++ 程序中实现SEH exceptions处理后,我受到了堆栈溢出异常的影响,我的软件没有捕获到该异常。

经过下一部分研究,我了解到,无法以编程方式检测到此类异常,因为我们没有可用的堆栈地址空间可供使用,因此程序内存已损坏。

想请教一下您在处理堆栈溢出异常方面的经验。这看起来像是一个挑战,如果在非托管代码编程语言中不可能,我真的很感兴趣?

下面我介绍我的示例程序 (C++) 的一部分,它再现了stack overflow exception. 它适用于任何SEH exception,但不是堆栈溢出:

0 投票
1 回答
295 浏览

c++ - 并非总是可以在“干净”的 Windows 8.1 上捕获 WoW64 上的 SEH

我有用 VS2008 编译的 Win32 MFC 应用程序。该应用程序具有 TreeConrtol。有一个 TVN_ITEMCHANGING 处理程序,在处理程序内部我强制重新绘制更改的树项。

这是带有 SEH 处理程序和直接 WinAPI 调用而不是 MFC 包装器的代码(这不会影响问题):

如果我在树控件中选择一个项目(以编程方式或通过鼠标单击),那么在从树控件中删除所有项目后(通过使用 DeleteAllItems 或一个接一个),我将获得已经没有的项目的 TVN_ITEMCHANGING存在,因此上面的代码在调用 ::SendMessage(hTreeCtrl, TVM_GETITEMRECT, ...) 时会导致结构化异常引发。

没关系,但是... __except 块永远不会在某些 Windows 8.1 Pro x64 上执行(可能在其他 Windows 版本上)。

我的工作机器是从 Windows 8 更新的英文 Windows 8.1 Pro x64(内部版本 9600)。在那台机器上一切正常(处理程序捕获异常并显示 MessageBox)。但是,在从 MSDN 下载的干净的英文 Windows 8.1 Pro x64(内部版本 9600)上,__except 块未被调用并且应用程序崩溃。故障模块名称:COMCTL32.dll

我在两台计算机上运行相同的 .exe 文件。您如何看待为什么会发生这种情况?

这是一个工作示例。我用 /EHsc 编译它,然后用 /EHa 编译它(真正的项目是用 /EHa 编译的,并使用 try/catch)。

示例中的代码与上面的函数不同:我添加了使用 try/catch 和_try / _except 的选项。

使用 /EHa,我可以在我的工作机器上使用 try/catch 或 _try / _except 捕获异常,使用 /EHsc 使用 _try / _except。但是这些组合都不适用于另一台机器(使用干净的 Win8.1):它不会捕获异常。

演示项目(使用 Visual Studio 2008 Professional SP1 + MFC 编译):这里.

PS:通过在 SendMessage() 调用中添加 if 条件暂时解决了问题,但这里我想调查一下异常处理的问题。

提前感谢您的评论。

0 投票
1 回答
990 浏览

winapi - 如何在 nasm-syntax asm 代码中定义和使用“结构数组”?

所以基本上我正在处理 Win32 上的伪 asm 代码,并且我试图让它重新组装。

在代码中,我看到这样的数据结构:

在 .text 部分,我看到如下代码:

基本上像上面那样的 asm 代码/数据不能直接在 windows 32 位上由 NASM/MASM 重新组装。所以我必须调整这个代码/数据......

我在网上搜索,找到了C中数据结构的定义:

所以我的问题是:如何修改 asm 代码/数据以使其重新组装?

谢谢!

0 投票
0 回答
237 浏览

windows - unwind_code 操作的意义 6

在 Windows SEH 数据中,有一种工具可以为给定的RUNTIME_FUNCTION一些伪操作定义描述其对堆栈的影响。它们在以下文档中定义:http UNWIND_CODE: //msdn.microsoft.com/en-us/library/ck9asaa9.aspx

但是,Microsoft 仅记录了版本 1!在 Windows 附带的某些东西(例如记事本)中,异常处理数据的给定版本是 2。在我看来它们非常相似(另请参见http://sourceforge.net/mailarchive/message.php ?msg_id=31650579),除了有一个神秘且非常常见的操作码6,在版本1文档中没有定义。

从我公认的小样本来看,操作信息似乎始终为 0 或 1,并且该操作似乎仅消耗展开操作数据中的一个槽。

似乎在 ReactOS 中,它的意思是 UWOP_SAVE_XMM(参见http://doxygen.reactos.org/d4/d85/rtl_2amd64_2unwind_8c_a552b9ed5f66cb1a0015f7523bfce2eb9.html#a552b9ed5f66cb1a0015f7523bfce2eb9)。在这种情况下(“版本 2”情况),这是一个不太可能的含义,因为以下插槽包含有效的展开操作而不是合理的内存偏移量。

unwind operation 6是什么意思?

0 投票
0 回答
422 浏览

windows - STATUS_FLOAT_MULTIPLE_FAULTS 和 STATUS_FLOAT_MULTIPLE_TRAPS 有什么区别?

当未屏蔽的 SSE 异常发生时,处理器会引发 SIMD 浮点异常。这是一个错误类型的异常,因此 EIP 停留在导致异常的指令上。

此异常被转换为上述状态代码之一。

两者有什么区别?