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,9 +4,11 @@ ...@@ -4,9 +4,11 @@
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')
try:
fd = int(sys.argv[2]) fd = int(sys.argv[2])
try: try:
...@@ -19,7 +21,7 @@ try: ...@@ -19,7 +21,7 @@ try:
sys.stderr.write("fd %d is open in child" % fd) sys.stderr.write("fd %d is open in child" % fd)
sys.exit(1) sys.exit(1)
except Exception: except Exception:
if verbose: if verbose:
raise raise
sys.exit(1) 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