Issue 23314: SuppressCrashReports now disables CRT assertions
SuppressCrashReports should be used in test subprocesses that test invalid conditions.
This commit is contained in:
parent
7caa615fb0
commit
c55a316cff
@ -2151,6 +2151,7 @@ class SuppressCrashReport:
|
||||
disable the creation of coredump file.
|
||||
"""
|
||||
old_value = None
|
||||
old_modes = None
|
||||
|
||||
def __enter__(self):
|
||||
"""On Windows, disable Windows Error Reporting dialogs using
|
||||
@ -2168,6 +2169,26 @@ class SuppressCrashReport:
|
||||
SEM_NOGPFAULTERRORBOX = 0x02
|
||||
self.old_value = self._k32.SetErrorMode(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:
|
||||
if resource is not None:
|
||||
try:
|
||||
@ -2199,6 +2220,12 @@ class SuppressCrashReport:
|
||||
|
||||
if sys.platform.startswith('win'):
|
||||
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:
|
||||
if resource is not None:
|
||||
try:
|
||||
|
@ -4,22 +4,24 @@
|
||||
|
||||
import sys
|
||||
import os
|
||||
from test.support import SuppressCrashReport
|
||||
|
||||
verbose = (sys.argv[1] == 'v')
|
||||
try:
|
||||
fd = int(sys.argv[2])
|
||||
|
||||
with SuppressCrashReport():
|
||||
verbose = (sys.argv[1] == 'v')
|
||||
try:
|
||||
os.write(fd, b"blat")
|
||||
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)
|
||||
fd = int(sys.argv[2])
|
||||
|
||||
except Exception:
|
||||
if verbose:
|
||||
raise
|
||||
sys.exit(1)
|
||||
try:
|
||||
os.write(fd, b"blat")
|
||||
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:
|
||||
raise
|
||||
sys.exit(1)
|
||||
|
Loading…
x
Reference in New Issue
Block a user