(cherry picked from commit 6e3d6b5dc2
)
This commit is contained in:
parent
f35076a002
commit
33217d2213
|
@ -755,6 +755,22 @@ class FaultHandlerTests(unittest.TestCase):
|
||||||
3,
|
3,
|
||||||
name)
|
name)
|
||||||
|
|
||||||
|
@unittest.skipUnless(MS_WINDOWS, 'specific to Windows')
|
||||||
|
def test_ignore_exception(self):
|
||||||
|
for exc_code in (
|
||||||
|
0xE06D7363, # MSC exception ("Emsc")
|
||||||
|
0xE0434352, # COM Callable Runtime exception ("ECCR")
|
||||||
|
):
|
||||||
|
code = f"""
|
||||||
|
import faulthandler
|
||||||
|
faulthandler.enable()
|
||||||
|
faulthandler._raise_exception({exc_code})
|
||||||
|
"""
|
||||||
|
code = dedent(code)
|
||||||
|
output, exitcode = self.get_output(code)
|
||||||
|
self.assertEqual(output, [])
|
||||||
|
self.assertEqual(exitcode, exc_code)
|
||||||
|
|
||||||
@unittest.skipUnless(MS_WINDOWS, 'specific to Windows')
|
@unittest.skipUnless(MS_WINDOWS, 'specific to Windows')
|
||||||
def test_raise_nonfatal_exception(self):
|
def test_raise_nonfatal_exception(self):
|
||||||
# These exceptions are not strictly errors. Letting
|
# These exceptions are not strictly errors. Letting
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
On Windows, faulthandler.enable() now ignores MSC and COM exceptions.
|
|
@ -366,6 +366,23 @@ faulthandler_fatal_error(int signum)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MS_WINDOWS
|
#ifdef MS_WINDOWS
|
||||||
|
static int
|
||||||
|
faulthandler_ignore_exception(DWORD code)
|
||||||
|
{
|
||||||
|
/* bpo-30557: ignore exceptions which are not errors */
|
||||||
|
if (!(code & 0x80000000)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/* bpo-31701: ignore MSC and COM exceptions
|
||||||
|
E0000000 + code */
|
||||||
|
if (code == 0xE06D7363 /* MSC exception ("Emsc") */
|
||||||
|
|| code == 0xE0434352 /* COM Callable Runtime exception ("ECCR") */) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/* Interesting exception: log it with the Python traceback */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static LONG WINAPI
|
static LONG WINAPI
|
||||||
faulthandler_exc_handler(struct _EXCEPTION_POINTERS *exc_info)
|
faulthandler_exc_handler(struct _EXCEPTION_POINTERS *exc_info)
|
||||||
{
|
{
|
||||||
|
@ -373,9 +390,8 @@ faulthandler_exc_handler(struct _EXCEPTION_POINTERS *exc_info)
|
||||||
DWORD code = exc_info->ExceptionRecord->ExceptionCode;
|
DWORD code = exc_info->ExceptionRecord->ExceptionCode;
|
||||||
DWORD flags = exc_info->ExceptionRecord->ExceptionFlags;
|
DWORD flags = exc_info->ExceptionRecord->ExceptionFlags;
|
||||||
|
|
||||||
/* bpo-30557: only log fatal exceptions */
|
if (faulthandler_ignore_exception(code)) {
|
||||||
if (!(code & 0x80000000)) {
|
/* ignore the exception: call the next exception handler */
|
||||||
/* call the next exception handler */
|
|
||||||
return EXCEPTION_CONTINUE_SEARCH;
|
return EXCEPTION_CONTINUE_SEARCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue