Kaydet (Commit) c55a316c authored tarafından Steve Dower's avatar Steve Dower

Issue 23314: SuppressCrashReports now disables CRT assertions

SuppressCrashReports should be used in test subprocesses that test invalid conditions.
üst 7caa615f
...@@ -2151,6 +2151,7 @@ class SuppressCrashReport: ...@@ -2151,6 +2151,7 @@ class SuppressCrashReport:
disable the creation of coredump file. disable the creation of coredump file.
""" """
old_value = None old_value = None
old_modes = None
def __enter__(self): def __enter__(self):
"""On Windows, disable Windows Error Reporting dialogs using """On Windows, disable Windows Error Reporting dialogs using
...@@ -2168,6 +2169,26 @@ class SuppressCrashReport: ...@@ -2168,6 +2169,26 @@ class SuppressCrashReport:
SEM_NOGPFAULTERRORBOX = 0x02 SEM_NOGPFAULTERRORBOX = 0x02
self.old_value = self._k32.SetErrorMode(SEM_NOGPFAULTERRORBOX) self.old_value = self._k32.SetErrorMode(SEM_NOGPFAULTERRORBOX)
self._k32.SetErrorMode(self.old_value | SEM_NOGPFAULTERRORBOX) self._k32.SetErrorMode(self.old_value | SEM_NOGPFAULTERRORBOX)
# Suppress assert dialogs in debug builds
# (see http://bugs.python.org/issue23314)
try:
import msvcrt
msvcrt.CrtSetReportMode
except (AttributeError, ImportError):
# no msvcrt or a release build
pass
else:
self.old_modes = {}
for report_type in [msvcrt.CRT_WARN,
msvcrt.CRT_ERROR,
msvcrt.CRT_ASSERT]:
old_mode = msvcrt.CrtSetReportMode(report_type,
msvcrt.CRTDBG_MODE_FILE)
old_file = msvcrt.CrtSetReportFile(report_type,
msvcrt.CRTDBG_FILE_STDERR)
self.old_modes[report_type] = old_mode, old_file
else: else:
if resource is not None: if resource is not None:
try: try:
...@@ -2199,6 +2220,12 @@ class SuppressCrashReport: ...@@ -2199,6 +2220,12 @@ class SuppressCrashReport:
if sys.platform.startswith('win'): if sys.platform.startswith('win'):
self._k32.SetErrorMode(self.old_value) self._k32.SetErrorMode(self.old_value)
if self.old_modes:
import msvcrt
for report_type, (old_mode, old_file) in self.old_modes.items():
msvcrt.CrtSetReportMode(report_type, old_mode)
msvcrt.CrtSetReportFile(report_type, old_file)
else: else:
if resource is not None: if resource is not None:
try: try:
......
...@@ -4,22 +4,24 @@ ...@@ -4,22 +4,24 @@
import sys import sys
import os import os
from test.support import SuppressCrashReport
verbose = (sys.argv[1] == 'v') with SuppressCrashReport():
try: verbose = (sys.argv[1] == 'v')
fd = int(sys.argv[2])
try: try:
os.write(fd, b"blat") fd = int(sys.argv[2])
except OSError:
# Success -- could not write to fd. try:
sys.exit(0) os.write(fd, b"blat")
else: except OSError:
# Success -- could not write to fd.
sys.exit(0)
else:
if verbose:
sys.stderr.write("fd %d is open in child" % fd)
sys.exit(1)
except Exception:
if verbose: if verbose:
sys.stderr.write("fd %d is open in child" % fd) raise
sys.exit(1) sys.exit(1)
except Exception:
if verbose:
raise
sys.exit(1)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment