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.
|
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:
|
|||||||
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:
|
|||||||
|
|
||||||
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 @@
|
|||||||
|
|
||||||
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.
|
|
||||||
sys.exit(0)
|
|
||||||
else:
|
|
||||||
if verbose:
|
|
||||||
sys.stderr.write("fd %d is open in child" % fd)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
except Exception:
|
try:
|
||||||
if verbose:
|
os.write(fd, b"blat")
|
||||||
raise
|
except OSError:
|
||||||
sys.exit(1)
|
# 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