问题标签 [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.
c++ - Visual Studio 显示 SEH 异常的错误位置
我有一个简单的代码:
默认调试 Visual Studio 设置。调试 -> 异常 -> 全部重置。
在调试配置中运行此代码后的结果 - 我在 exc.exe 中的 0x77d315de (ntdll.dll) 处遇到异常未处理的异常:0xC0000005:访问冲突写入位置 0x00000000。VS 打开文件ostream,指针停留在这里:
堆栈跟踪:
如果我在 Debug -> Win32 Exceptions -> C0000005 Visual Studio 中设置复选框“Thrown”,则在正确的位置停止。
我的同事拥有相同的 Visual Studio、Windows 7 x64 和相同的硬件。但是他的 VS 停在正确的地方,没有改变异常设置。
我的 Visual Studio 设置有什么问题?
最大的问题 - .net 异常的行为也不典型。此时在调试模式下,VS 几乎忽略了所有异常。看起来我有全局异常过滤器并且所有异常都得到了处理。程序可以在发布模式下运行并显示对话框 Catel mvvm 工具包向我发送关于未注册模型和文件系统异常的异常。
任何想法,我如何在不设置“抛出”复选框的情况下修复它。
[编辑]
好吧,我发现了一些奇怪的东西。更改 Debug -> Exceptions 后,我在异常处停止。但是,如果我按继续,我将转到 ostream 文件。看起来 VS 调试器默认按“继续”。
[编辑]
这就是我在输出中看到的。只有一个例外。看起来异常以某种方式处理,然后在其他地方抛出。
visual-studio - g++上的safeseh gs
我想编译一个 c++ 文件。我正在关注一个教程,在本教程中,文件是用 Visual Studio 编译的,我没有。我想对 g++ 做同样的事情。在本教程中,使用 VS 中的 /GS 和 /SafeSEH。我想知道如何使用 g++ 编译器使用这些标志编译我的文件。
抱歉,如果我的问题很简单,我以前从未使用过 g++。对不起我的英语。谢谢你。
exception - 异常处理程序在捕获 SEH 异常时不调用析构函数
输出:
ScopedShit()
继续...
我正在阅读这篇文章http://www.codeproject.com/Articles/2126/How-aC-compiler-implements-exception-handling,其中解释了:
但在它(异常处理程序)调用 catch 块之前(它从 funcinfo 结构中知道 catch 块的地址,见图 4),它必须执行堆栈展开:清理该函数帧下面的函数的堆栈帧。堆栈帧的清理涉及到非常小的复杂性:异常处理程序必须在异常发生时在帧上找到函数的所有本地对象并调用它们的析构函数。
我错过了什么吗?
exception - 这个 asm 代码如何设置 SEH?
我从互联网上获取了一些代码,这些代码应该用 SEH 处理异常,
但是FS:[0]
应该持有处理程序的地址,对吗?
所以mov fs:[0], esp
是错误的,因为esp
当前指向原始fs:[0]
:
堆栈是这样的:
那么,不应该是esp + 4
这样的东西吗?我显然错了,但我不明白为什么。
c++ - WindowProc 中的异常
是否可以在WindowProc
回调中捕获错误?try
/catch
不起作用。看起来__try
__except
和硬件异常(AV
例如)也不起作用。
更新:
我发现确实可以在WindowProc
回调中抛出异常并用catch
block outside捕获它WindowProc
。经过测试并适用于Windows XP x86
. 我在 WndProc 中发现了相关的问题 64bit exceptions silently fail这个问题似乎只存在于Windows 7 x64
(并且根据该问题也存在于其他 x64 Windows 版本上)。
所以问题是有可能以某种方式抛出异常并用块外WindowProc
捕获它吗?我安装了 microsoft hotfix,在注册表中设置为 1,我得到的最好的是,不是我的例外。catch
WindowProc
DisableUserModeCallbackFilter
FATAL_USER_CALLBACK_EXCEPTION
c - 手动安装的 SEH 在内部块中不起作用
在阅读了速成课程 和这里的一些帖子之后,我实现了一个非常基本的版本。我唯一的要求是能够“捕获”任何异常(只有“Win32”,因为我不抛出/引发任何异常)并退出引发它的线程。我有一个正确原型化的函数,它只调用'ExitThread',还有一个'EXCEPTION_REGISTRATION'结构,它在它的处理程序属性中,以及在前一个属性中的实际前一个句柄。我设置这个处理程序的方法是调用:
问题: 当我导致异常时(比如:
在我调用 set_my_handler 的同一范围内,我的处理程序按预期调用。但是,如果我在内部块中导致相同的异常,通过调用执行它的函数,它就是行不通的。我得到未处理的异常消息框。在调试时,我注意到 FS:[0] 在内部函数中保持不变(指向我的处理程序)。顺便说一句,我没有使用任何(try/catch 或 try/_except 在我的代码中)
感谢您的帮助,谢谢。
我的问题的答案(感谢Raymond Chen):事实证明,异常注册实体必须在堆栈上分配,因为有一种安全机制可以根据堆栈段寄存器验证其位置。
c++ - 使用 SEH(结构化异常处理)时观察到的不同行为
我正在用 SEH 做一些实验。在我的代码中,我在 __try 子句中编写了导致错误的块,并在 __except() 中编写了一个处理程序。
__except() 的第二个参数是以下之一 -
EXCEPTION_CONTINUE_SEARCH 无法识别异常。继续在堆栈中搜索处理程序,首先是包含 try-except 语句,然后是具有下一个最高优先级的处理程序。
EXCEPTION_CONTINUE_EXECUTION 异常被识别但被解除。在发生异常的地方继续执行。
EXCEPTION_EXECUTE_HANDLER 识别出异常。通过执行 __except 复合语句将控制权转移到异常处理程序,然后在发生异常的点继续执行。
当我使用 EXCEPTION_CONTINUE_EXECUTION/EXCEPTION_EXECUTE_HANDLER 时,它不会在异常发生点继续执行(可能是我误解了异常发生点的含义)。当我在调试模式下运行它时,输出是
当我在发布模式下运行它时,输出是
我不明白为什么它的行为不同。任何人请帮忙。
c - 使用 Windows SEH 和 GCC label-as-value 跳转到本地错误处理程序
我需要对一些失败案例引发异常的代码进行单元测试。简而言之,我需要通过展开堆栈帧或本地跳过错误来处理异常。使用 MSVC 不是一种选择。
AddVectoredExceptionHandler的MSDN 示例表明我可以修改 eip 然后返回 EXCEPTION_CONTINUE_EXECUTION 来执行本地跳转。显而易见的问题是要跳转到什么地址。GCC 的Label as Value功能似乎应该就是这样。
如果错误函数只有一次返回,则下面的示例有效。但是,如果添加第二条 return 语句,则跳转的偏移量非常小,跳转失败。为什么?
.net - 没有被 Try/Catch 捕获的 SEHException
在后台线程中,我的应用程序会定期检查网络文件夹(UNC 路径)以获取应用程序更新。它读出文件的汇编版本,如下所示:
这个片段经常被执行,到目前为止,我猜在多个客户网站上总共执行了超过 100.000 次,没有问题。
有时,GetAssemblyName
会引发 a FileNotFoundException
,例如在无法访问网络文件夹的情况下(可能会发生并且必须处理)。这个异常被Catch
下面的块捕获,一切正常。
然而,在三个报告的案例中,该GetAssemblyName
电话引发了SEHException
. 奇怪的是,这个异常并没有被Catch
下面的块捕获,而是被我的全局未处理异常处理程序(System.AppDomain.CurrentDomain.UnhandledException
)捕获。结果,应用程序崩溃。
这是异常详细信息(不幸的是,我的错误处理例程没有记录异常的ErrorCode
和字段):CanResume
为什么异常没有被Catch
下面的块捕获?
(也许这是相关的:这只发生在客户站点上,其中 UNC 路径指向的服务器不是本地网络的一部分,而是 VPN 上的远程服务器。)
c++ - 模板函数接受带有 X 参数的可调用函子
我正在编写一个托管的 C++ 程序,它运行用户编写的即时编译的 C 代码。从 C 代码中捕获某些典型异常并进行处理/忽略是绝对重要的。为此,我从结构化异常处理块中调用 C 代码。由于这个块的性质和语义(以及它的调用位置),我已经将实际调用分离到它自己的函数:
效果很好,因为它应该像这样:
但是是否有可能塑造它,以便我可以调用具有可变数量参数的函数 - 也许通过使用一些奇异的函子(唯一的要求显然是它不能有析构函数)?我正在使用 MSVC++ 2010。