问题标签 [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 回答
923 浏览

c++ - 解读 Procdump 异常代码 00000006,以及 E06D7363.J 和 E06D7363.msc 的区别

我正在分析一个 c++ 应用程序的转储文件,由ProcDump. 生成的日志文件ProcDump包含大量Exception: C0000005.ACCESS_VIOLATION 易于理解的访问冲突。

但是我还没有理解这些的含义00000006

  • [15:39:59] Exception: 00000006

其次,虽然我发现这意味着 C++ 异常,但我没有设法找到和E06D7363之间的区别。有什么区别吗?Exception: E06D7363.JException: E06D7363.msc

0 投票
2 回答
4911 浏览

c++ - Linux 中的 SEH 等效项或如何处理 OS 信号(如 SIGSERV)但仍继续

我目前正在开发一个单元测试框架,用户可以在其中创建测试用例并在框架中注册。

我还想确保如果任何用户测试代码导致崩溃,它不应该使整个框架崩溃,而是应该被标记为失败。为了完成这项工作,我编写了以下代码,以便我可以在沙盒函数中运行用户代码

这在 Windows 上完美运行,但我希望我的框架是可移植的,为了做到这一点,我想确保 posix 环境具有类似的功能。

我知道 C 信号处理程序可以拦截 OS 信号,但是将信号处理机制转换为 SEH 框架有一些我无法解决的挑战

  1. 即使我的程序收到信号,如何继续执行?
  2. 如何将执行控制从失败位置跳转到可用于错误处理的块(类似于除外)?
  3. 如何清理资源?

另一种可能性是我正在考虑在具有自己的信号处理程序的单独线程上运行用户测试代码并从信号处理程序终止线程,但再次不确定这是否可行。

因此,在我想得更远之前,如果他们知道解决这个问题/情况的更好解决方案,我希望得到社区的帮助。

0 投票
1 回答
906 浏览

c - 在回调中 RaiseException(...) win32 seh 异常是否安全?(在 x86 和 x64 上)

在某些情况下,我想调用RaiseException()以在传递给 Win32 函数的回调中引发异常。

作为一个例子,我想调用RaiseException()一个并在调用堆栈更下方的LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM)一个块中处理它。__try { } __except() { }

这是否“安全”,因为它将在 x86 和 amd64 上具有可预测的结果?从不会泄漏资源的意义上说,它是否“安全”†?

†:假设我控制的任何中间堆栈帧都以不会泄漏资源的方式设置。我只关心对我来说“不透明”的 Win32 API 堆栈帧。

0 投票
1 回答
350 浏览

c# - 在 .NET 中读取本机 win32 异常数据/参数

我正在尝试接收有关我在托管 (.net/c#) 的 catch 块中在本机 (c++/win32) 中抛出的异常的数据。

例如,在 c++ 中,我们可以:

这个函数可以通过 C# 中的 P/Invoke 调用:

SEHException不包含来自导入的 DLL 函数的字符串

SEHException.ErrorCode 似乎总是 E_FAIL,但无论如何我都想编组比 int 更丰富的数据。

我是否遗漏了什么,或者是否有另一种方法可以通过异常获取此字符串数据?

目的是通过设置本机过滤器(如 SetUnhandledExceptionFilter,FYI),使用本机堆栈跟踪重新引发本机异常。

0 投票
1 回答
354 浏览

windows - 结构化异常处理程序在几乎相同的机器上以不同的方式捕获接近零的 EIP 陷阱?

我有一个相当复杂但经过严格测试的汇编语言 x86-32 应用程序,在各种 x86-32 和 x86-64 机器上运行。这是一个语言编译器的运行时系统,因此它支持执行另一个已编译的二进制程序,即“目标代码”。

它使用 Windows SEH 捕获各种类型的陷阱:除以零、非法访问……并使用 Windows 提供的上下文信息打印寄存器转储,显示陷阱时机器的状态。(它做了很多与问题无关的其他事情,例如打印函数回溯或根据需要从除以零中恢复)。这允许“目标代码”的编写者了解他的程序出了什么问题。

它在两个或多或少相同的 Windows 7-64 系统上表现不同,我认为这是非法内存访问。具体问题是某处的“目标代码”(不是经过良好测试的运行时系统)愚蠢地将 0x82 加载到 EIP 中;那是地址空间AFAIK中不存在的页面。我希望通过 SEH 出现 Windows 陷阱,并希望使用 EIP=00000082 等进行注册转储。

在一个系统上,我得到的正是那个寄存器转储。我可以在这里展示它,但它不会给我的问题添加任何东西。所以,很明显我的运行时系统中的 SEH 可以捕捉到这一点,并显示情况。这台机器上没有任何MS开发工具。

在另一个(“神秘”)系统上,运行时系统和目标代码具有相同的二进制文件,我得到的只是命令提示符。没有进一步的输出。FWIW,这台机器上有 MS Visual Studio 2010。神秘机器被大量用于其他目的,在正常使用中没有表现出其他有趣的行为。

我假设行为差异是由某处的 Windows 配置或 Visual Studio 控制的东西引起的。系统菜单不是DEP配置;它们都被配置(vanilla)为“标准系统进程的 DEP”。我的运行时系统可执行文件配置了“No (/NXCOMPAT:NO)”。

两台机器都是 i7,但芯片不同,4 核,大量内存,不同的主板。我认为这无关紧要。当然,这两个 CPU 都以相同的方式捕获陷阱。

运行时系统在启动时包括以下行:

SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); // 在崩溃时停止 Windows 弹出窗口

这是最近添加的,以防止“神秘”系统在崩溃发生时显示弹出窗口“xxx.exe 已停止工作”。弹出框行为不会在第一个系统上发生,因此所做的只是将问题推到“神秘”机器上的另一个角落。

我想在哪里配置/控制这个有什么线索吗?

我在这里提供了我正在使用的 SEH 代码。它已被编辑以删除大量的健全性检查代码,我声称这些代码对该代码中看到的明显状态没有影响。

运行时系统的顶层生成一组工作线程(使用CreateThread)并指向执行ASMGrabGranuleAndGo;每个线程都设置自己的 SEH,并分支到工作窃取调度程序 RunReadyGranule。据我所知,SEH 在那之后没有改变;至少,运行时系统和“目标代码”不这样做,但我不知道底层(例如,标准“C”)库可能会做什么。

再往下,我提供了陷阱处理程序 TopLevelEHFilter。是的,套准印刷机本身可能会爆炸导致第二个异常。我会尽快再次检查,但 IIRC 我最后一次尝试在神秘机器上的调试器中捕获这个,没有将控制权传递给调试器,只是让我弹出窗口。

0 投票
2 回答
5295 浏览

visual-c++ - 整数除以零异常未被捕获

我一直在阅读Jesse Liberty 撰写的《在 21 天内自学 C++ 》一书,并遇到了异常和错误一章。作者使用了这个例子:

对他来说效果很好。异常被捕获,输出为:

我自己试了一下,收到以下错误:

整数除以零

根据这个线程,“整数除以零在标准 C++ 中不是例外。” 但是 Visual Studio 显然在这里抛出了一个异常,虽然没有捕捉到它。

我尝试定义topand bottomas double,我收到以下输出:

那么为什么try catch块没有捕获integer division by zero异常呢?

0 投票
1 回答
487 浏览

windows - 故意使我的 Windows 应用程序崩溃的最佳方法是什么?

我在我的 Qt 应用程序的 Windows 版本中添加了一个 mini-core-dump 功能(通过 __try/__except 和 MiniDumpWriteDump()),因此如果/当我的应用程序崩溃时,一个 .dmp 文件将被写入磁盘供我稍后查看和调试。

这工作得很好,但为了测试,我希望有一个已知可靠的方法来让我的程序崩溃。例如,GUI 中可能有一个“立即崩溃”按钮,当用户单击它时,它会导致应用程序故意崩溃。

当然,一种方法是这样的:

这对我有用,但我不喜欢这种方法,因为它依赖于未定义的行为——特别是,C++ 标准不需要上述代码导致崩溃,所以它是可能的(从语言律师的角度来看) 当上面的代码执行时,一些未来版本的编译器不会崩溃。

作为一种更“官方”的方法,我尝试了这个:

...确实会终止程序,但不会导致触发 MiniCrashDump 处理程序的 Windows 结构化异常,因此不会写入 .dmp 文件。

我的问题是,是否有“官方正确的方法”让我的程序崩溃?我看到 Windows API 有一个可以调用的 RaiseException() 函数,但我不确定它的正确参数应该是什么。这是要走的路,还是有一些更具体的电话我会更好地使用?

0 投票
1 回答
1598 浏览

c++ - 如何从 SEH 异常生成堆栈跟踪

我正在使用 Win32 SEH 捕获异常:

过滤器函数如下所示:

到目前为止,这有效,并且 in 的值xp->ContextRecord->Eip告诉我哪个函数导致了访问冲突(实际上 - ntdll.dll!RtlEnterCriticalSection ,EDX 的值告诉我这个函数是用一个虚假的参数调用的)。

但是,这个函数在很多地方都被调用,包括从其他 WinAPI 函数中调用,所以我仍然不知道哪个代码负责使用虚假参数调用这个函数。

是否有任何代码可以用于生成函数调用链的跟踪,该函数调用导致 EIP 现在所在的位置,基于信息EXCEPTION_POINTERS或其他信息?(不能在外部调试器下运行程序)。

只需 EIP 值就可以了,因为我可以在链接器映射和符号表中查找它们,尽管如果有一种方法可以自动将它们映射到符号名称会更好。

我正在为这个项目使用 C++Builder 2006,尽管 MSVC++ 解决方案可能仍然有效。

0 投票
2 回答
1525 浏览

c++ - EXCEPTION_CONTINUE_EXECUTION 奇怪的行为

我写了代码

我正在等待输出

但我只有

和无限循环。

为什么?

volatile键名添加到 s 和 j 并没有解决它。

0 投票
1 回答
218 浏览

c++ - VC 中的 C++ 异常,没有 SEH

是否可以使用 VC(最好是最新版本之一)并使用未通过 SEH 实现的 C++ 异常?

注意 - 我的意思不是使用 C++ catch 子句 (/Eha \ /Ehsc) 来捕获 SEH 异常,我的意思是使用 C++ 异常而不让 SEH 异常在后台飞来飞去。