如何在 Windows 上检查子进程是否被信号杀死

2024-05-27

问题

给定一个在 python 中启动的子进程,其代码类似于:

import subprocess
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()
print('Return code: {}'.format(p.returncode))

根据官方文档 https://docs.python.org/3.7/library/subprocess.html#subprocess.CompletedProcess.returncode,可以检查子进程是否被信号终止:

负值 -N 表示子进程被信号 N 终止(仅限 POSIX)。

但仅限于 POSIX 平台。

有没有办法在 Windows 平台上检查进程是否被信号终止(不关心是哪个信号)?

背景

我在运行 googletest 测试时遇到了这个问题。这故障中断 CLI 标志测试 https://github.com/google/googletest/blob/2fe3bd994b3189899d93f1d5a881e725e046fdc2/googletest/test/googletest-break-on-failure-unittest_.cc在 Windows 平台(VC14、VS2017)上失败,但在 POSIX 平台(2x Ubuntu、2x macOS)上运行良好。

在命令行上手动,我得到以下结果:

> .\googletest-break-on-failure-unittest_.exe --gtest_break_on_failure
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from Foo
[ RUN      ] Foo.Bar
<some path>\googletest\test\googletest-break-on-failure-unittest_.cc(52): error: Expected equality of these values:
  2
  3

> echo %ERRORLEVEL%
-2147483645

但是,调用此测试的 python 包装器接收2147483651(正数)。

(我之前刚刚添加了一个打印这条线 https://github.com/google/googletest/blob/2fe3bd994b3189899d93f1d5a881e725e046fdc2/googletest/test/gtest_test_utils.py#L290)

请注意,这些指的是数字0xFFFFFFFF80000003(负数)和0x‭80000003‬(正数)以十六进制表示,并且返回代码没有被进一步处理。 (看here https://github.com/google/googletest/blob/2fe3bd994b3189899d93f1d5a881e725e046fdc2/googletest/test/gtest_test_utils.py#L245)

为什么返回码会这样改变呢?

PS:是的,我查过GTEST_OS_WINDOWS and GTEST_HAS_SEH在 C++ 代码中是正确的。


CMD's ERRORLEVEL环境变量是一个 32 位有符号值。正范围是 0x00000000-0x7FFFFFFF(0 到 2147483647),负范围是 0x80000000-0xFFFFFFFF(-2147483648 到 -1)。当进程由于未处理的异常而退出时,状态通常是异常代码,通常是 32 位带符号的NTSTATUS https://msdn.microsoft.com/en-us/library/cc704588价值。也就是说,没有什么可以阻止我们打电话ExitProcess or TerminateProcess带有超过 0x7FFFFFFF 的无符号退出代码,因此负数ERRORLEVELCMD 本身并不意味着进程异常退出。

在本例中,-2147483645 是NTSTATUS code STATUS_BREAKPOINT(0x80000003)。这源于gtest_break_on_failure https://github.com/google/googletest/blob/827515f8a092050901d4eb9fdc1ddbb972f38442/googletest/src/gtest.cc#L4732Google Test 的选项,调用 WinAPIDebugBreak https://msdn.microsoft.com/en-us/library/windows/desktop/ms679297(v=vs.85).aspx。对于 x86 架构,后一个函数只是执行一个int 3指令(软件中断3),该指令被捕获在内核中以引发断点异常。

通常,如果没有附加的调试器,这将执行默认的 Windows 未处理的异常处理程序,该处理程序调用Windows 错误报告 https://en.wikipedia.org/wiki/Windows_Error_Reporting(见下文)。但是问题集中链接的代码ExitWithExceptionCode作为应用程序的未处理异常过滤器。该过滤器只是通过以下方式退出exit(exception_pointers->ExceptionRecord->ExceptionCode).

至于Unix信号,Windows内核没有实现它们。 C 运行时实现了标准 C 所需的六个。在控制台应用程序中,标准SIGINT信号与控制台相关联CTRL_C_EVENT。非标的SIGBREAK信号用于其他控制台控制事件,包括CTRL_BREAK_EVENT and CTRL_CLOSE_EVENT。这些事件的默认处理程序调用ExitProcess(STATUS_CONTROL_C_EXIT)。因此,要从字面上回答这个问题,要确定进程是否被控制台“信号”杀死,请检查STATUS_CONTROL_C_EXIT(0xC000013A 或-1073741510)。


处理未处理的异常

  • 如果调试器连接到进程调试端口,内核会向其发送第一次机会异常事件。如果它不处理异常,内核会将异常分派到线程的向量异常处理程序和结构化异常处理程序链(基于堆栈,从当前帧反向检查)。我们假设异常没有被它们中的任何一个处理。

  • 最后检查的帧是线程启动函数的帧,RtlUserThreadStart。该帧的处理程序,_C_specific_handler,传递一个调度记录,允许它确定范围的异常过滤器。该过滤器依次调用进程的未处理异常过滤器,因为它之前是通过设置的RtlSetUnhandledExceptionFilter。在进程启动时,kernelbase.dll 的初始化例程将其设置为适当命名的函数,UnhandledExceptionFilter.

  • 如果连接了调试器,UnhandledExceptionFilter回报EXCEPTION_CONTINUE_SEARCH。随后,内核向调试器发送第二次机会异常事件。如果调试器不处理异常,内核会尝试将事件发送到子系统,即 Windows 会话服务器 csrss.exe。服务器随后将故障转发给 Windows 错误报告 (WER) 服务,该服务最终将终止该进程。

  • 如果没有附加调试器,UnhandledExceptionFilter调用应用程序的未处理异常过滤器(如果之前已通过设置)SetUnhandledExceptionFilter https://msdn.microsoft.com/en-us/library/windows/desktop/ms680634。如果应用程序过滤器返回EXCEPTION_CONTINUE_EXECUTION or EXCEPTION_EXECUTE_HANDLER, then UnhandledExceptionFilter将此值返回给帧处理程序。

  • 如果应用程序没有设置自己的过滤器或者它的过滤器返回EXCEPTION_CONTINUE_SEARCH, then UnhandledExceptionFilter接下来检查作业、进程和线程错误模式的标志SEM_NOGPFAULTERRORBOX。该标志禁用错误报告,在这种情况下过滤器只是返回EXCEPTION_EXECUTE_HANDLER.

  • 如果允许错误报告,UnhandledExceptionFilter调用 Windows 错误报告 (WER) 服务。当 WER 处于循环中时,行为最终取决于它在注册表、组策略中的配置方式以及当前 Windows 版本的默认行为。 WER 可以根据系统“AeDebug”设置创建并附加调试器进程。如果它附加了调试器,UnhandledExceptionFilter回报EXCEPTION_CONTINUE_SEARCH,就像已经附加了一个调试器一样。否则返回EXCEPTION_EXECUTE_HANDLER.

  • 最终,如果它执行“未处理”异常的异常处理程序,则堆栈首先展开到RtlUserThreadStart框架通孔RtlUnwindEx,这将调用任何finally中间帧中的终止处理程序。异常处理程序的执行上下文通过以下方式恢复RtlRestoreContext,并且异常代码在整数返回寄存器中设置(例如rax在 x64 中)。最后,处理程序通过以下方式自行终止NtTerminateProcess(NtCurrentProcess(), exceptionCode).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Windows 上检查子进程是否被信号杀死 的相关文章

  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • 将 CrashDumps 转储到应用程序运行所在的同一文件夹中

    我编写了一个应用程序 我希望对其进行一定程度的自动调试 我想使用 Windows 错误报告将故障转储输出到应用程序运行所在的同一文件夹中 我的想法是 我可以让我的应用程序在它自己的文件夹中查找任何 dmp 文件 然后根据需要上传它们进行分析
  • Python 函数可以从作用域之外赋予新属性吗?

    我不知道你可以这样做 def tom print tom s locals locals def dick z print z name z name z guest Harry print z guest z guest print di
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • SetCurrentDirectoryW 中的错误 206

    在我之后之前不清楚的问题 https stackoverflow com questions 44389617 long path name in setcurrentdirectoryw 我以某种方式能够创建一个具有长路径名的目录 但是
  • Pygame:有没有简单的方法可以找到按下的任何字母数字的字母/数字?

    我目前正在开发的游戏需要让人们以自己的名义在高分板上计时 我对如何处理按键有点熟悉 但我只处理过寻找特定的按键 有没有一种简单的方法可以按下任意键的字母 而不必执行以下操作 for event in pygame event get if
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • teracopy 如何替换默认的 Windows 副本

    我问了这个问题Windows 文件复制内部结构 动态加密 https stackoverflow com questions 24220382 windows file copy internals on the fly encryptio
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • Windows C++ 中的键盘钩子还是什么?

    我希望构建自己的应用程序 它可以将键盘命令 消息 发送到 Windows 操作系统 例如 当我按下组合键 ctrl shift n 时 我希望启动 notepad exe 我怎样才能做到这一点 您对所使用的概念有什么建议吗 我读过 何时使用
  • Windows 目录永远不会包含临时文件的非 ASCII 字符?

    在 Windows 上使用 MinGW 7 3 0 由于 Windows 限制 Hunspell 无法从包含非 ASCII 字符的位置加载字典文件 我已经尝试了所有方法 1 现在我将文件复制到没有 ASCII 字符的路径 然后再将其交给 H
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class

随机推荐

  • 在 iPhone 的日期选择器中插入空白值

    我有一个日期选择器 使用操作表显示 我想在日期选择器中插入一个空白值并将其设置为默认值 它应该仅根据用户选择而改变 这可能吗 如果是的话怎么办 感谢所有宝贵的建议 UIDatePicker 仅支持某些模式 并且不允许这种自定义 将空白或自定
  • UITextField:键盘出现时移动视图

    我目前正在开发一个具有单个视图的 iPhone 应用程序 该应用程序有多个 UITextFields 用于输入 当键盘显示时 它会覆盖底部的文本字段 所以我添加了相应的textFieldDidBeginEditing 方法 将视图向上移动
  • SQL Server xp_cmdshell

    有没有其他方法可以通过以下方式获取文件名列表T SQL以外 INSERT INTO backups filename EXEC master sys xp cmdshell DIR b c some folder with sql back
  • 从可变长度字符串中解析值的最佳方法是什么?

    假设我有一个由可变长度的逗号分隔的整数字符串 分割字符串并用值更新变量 如果存在 的最佳方法是什么 目前 我有以下内容 a b c 10 10 1 default values mylist int x for x in input spl
  • Visual C++ free 和 malloc 的线程安全性?

    有谁知道 free 和 malloc 在 Visual C 2010 上是否是线程安全的 我遇到了奇怪的问题 内存被损坏 我几乎认为这是唯一的可能性 有谁知道安全装置是否可以打开和关闭以及如何打开和关闭 前提是您链接的是线程安全库 http
  • C# Application Insight 失败:TrackEvent 未发送到 Azure Application Insight

    我对 Azure Application Insight 完全陌生 并尝试通过我的本地计算机发送 TrackEvent 但Azure Application Insight似乎没有收到任何信息 这是我的要求 规格 我安装了 applicat
  • 在 Linux 上,在 Eclipse CDT 中使用 gdb 调试 C++ 应用程序,如何向 stdin 输入内容?

    在 Linux 上 我尝试在 Eclipse CDT 中使用 gdb 调试 C 应用程序 例如应用程序applic exe接受一些命令行参数arg1 and arg2它期望一些数据stdin 比如说 取自文件input txt 通常 要在控
  • Python 删除额外的特殊 unicode 字符

    我正在 python 中处理一些文本 它内部已经采用 unicode 格式 但我想删除一些特殊字符并用更标准的版本替换它们 我目前有一条看起来像这样的线路 但它变得越来越复杂 我发现它最终会带来更多麻烦 tmp infile lower r
  • 如何读取其他应用程序的SharedPreferences(相同用户ID)?

    在安卓4 3上测试 我有两个应用程序 com my app first and com my app second 在我的活动中 我想读取其他应用程序的首选项 我选择对我的两个应用程序使用相同的用户 ID android sharedUse
  • 如何跳过 SSIS 数据流中的最后一行

    我在用FlatFile Source Manager gt Script COmponent as Trans gt OLEDB destination在我的数据流中 源从平面文件读取所有行 我想跳过更新数据库的最后一行 预告片记录 由于它
  • iPhone 4G 拍照时应用程序崩溃?

    我已从我的设备中拍摄照片并调整图像大小并将其设置到我的图像视图框架 但我的应用程序在拍摄照片后有时会崩溃 使用调整大小 现在我已经用 iPhone 4G 拍了这张照片 仅当许多应用程序在后台运行 多任务 时 应用程序才会崩溃 那么我该如何解
  • 在 Javascript 中缓存和预取过期的 Promise

    Promise 是我在 Javascript 中管理异步代码的首选方式 Memoize npm 上的 memoizee 是一个 Javascript 库 用于轻松缓存和预取函数结果 理想情况下 我想结合两者的优点 并且能够使 Promise
  • 从 onclick 属性调用 e.stopImmediatePropagation()

    如何从事件对象中获取事件对象onclick属性 我努力了 a href something html Click me a 另外 我也尝试过这个 a href something html Click me a 但控制台只显示 a 元素 我
  • 在 docker 镜像中包含层有哪些优点?

    假设我有两个不同的 Dockerfile 图像一名为 nudoc my base image 1 1 FROM ubuntu 16 10 COPY test war 图像二名为 nudoc my testrun image 1 1 FROM
  • 为什么使用 no-op 来填补 paxos 事件之间的空白是合法的?

    我正在学习Paxos算法 http research microsoft com en us um people lamport pubs paxos simple pdf http research microsoft com en us
  • ajax响应:无法读取响应中的所有标头

    我正在使用 ajax 发出发布请求 CORS 并且我正在设置一个标题 Content Type application x www form urlencoded 并且我正在尝试读取响应的标题 这是我所做的 function makePos
  • 防止Rails Turbolinks导致Google地图JS多次执行

    我目前正在开发 Rails 应用程序 但出现以下错误 您已在此页面上多次包含 Google Maps API 这可能会导致意外错误 经过一番研究后 我发现 Turbolinks 导致了这个问题 当 的时候link to单击后 Google
  • IIS 7.5 HTTP 500.19 内部服务器错误配置无效

    我使用的是 Windows 2008 R2 和 IIS 7 5 并将我的网站源映射到网络驱动器 当我这样做时 会出现以下错误 当指向本地 c 驱动器时 网站可以正常工作 Error Summary HTTP Error 500 19 Int
  • 拖动调整 NSView(或其他对象)的大小

    我正在尝试构建一个应用程序 允许用户使用可以调整大小的矩形边界框来指定图像的多个区域 到目前为止 我已经有一个NSScrollView其中包含一个NSImageView这样用户就可以放大图像并根据需要滚动 我目前的想法是我可以使用NSVie
  • 如何在 Windows 上检查子进程是否被信号杀死

    问题 给定一个在 python 中启动的子进程 其代码类似于 import subprocess p subprocess Popen command stdout subprocess PIPE stderr subprocess PIP