Adjust stack trace parsing for newer Python
This commit is contained in:
parent
df9cef3a58
commit
aa93eb1614
|
|
@ -48,8 +48,8 @@ def parse_fatal_stacktrace(text):
|
||||||
lines = [
|
lines = [
|
||||||
r'(?P<type>Fatal Python error|Windows fatal exception): (?P<msg>.*)',
|
r'(?P<type>Fatal Python error|Windows fatal exception): (?P<msg>.*)',
|
||||||
r' *',
|
r' *',
|
||||||
r'(Current )?[Tt]hread [^ ]* \(most recent call first\): *',
|
r'(Current )?[Tt]hread .* \(most recent call first\): *',
|
||||||
r' File ".*", line \d+ in (?P<func>.*)',
|
r' (File ".*", line \d+ in (?P<func>.*)|<no Python frame>)',
|
||||||
]
|
]
|
||||||
m = re.search('\n'.join(lines), text)
|
m = re.search('\n'.join(lines), text)
|
||||||
if m is None:
|
if m is None:
|
||||||
|
|
@ -58,7 +58,7 @@ def parse_fatal_stacktrace(text):
|
||||||
else:
|
else:
|
||||||
msg = m.group('msg')
|
msg = m.group('msg')
|
||||||
typ = m.group('type')
|
typ = m.group('type')
|
||||||
func = m.group('func')
|
func = m.group('func') or ''
|
||||||
if typ == 'Windows fatal exception':
|
if typ == 'Windows fatal exception':
|
||||||
msg = 'Windows ' + msg
|
msg = 'Windows ' + msg
|
||||||
return msg, func
|
return msg, func
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,31 @@ Thread 0x00007fa135ac7700 (most recent call first):
|
||||||
File "", line 1 in testfunc
|
File "", line 1 in testfunc
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
VALID_CRASH_TEXT_PY314 = """
|
||||||
|
Fatal Python error: Segmentation fault
|
||||||
|
_
|
||||||
|
Current thread 0x00000001fe53e140 [CrBrowserMain] (most recent call first):
|
||||||
|
File "qutebrowser/app.py", line 126 in qt_mainloop
|
||||||
|
File "qutebrowser/app.py", line 116 in run
|
||||||
|
File "qutebrowser/qutebrowser.py", line 234 in main
|
||||||
|
File "__main__.py", line 15 in <module>
|
||||||
|
_
|
||||||
|
Current thread's C stack trace (most recent call first):
|
||||||
|
Binary file "...", at _Py_DumpStack+0x48 [0x10227cc9c]
|
||||||
|
<truncated rest of calls>
|
||||||
|
"""
|
||||||
|
|
||||||
|
VALID_CRASH_TEXT_PY314_NO_PY = """
|
||||||
|
Fatal Python error: Segmentation fault
|
||||||
|
_
|
||||||
|
Current thread 0x00007f0dc805cbc0 [qutebrowser] (most recent call first):
|
||||||
|
<no Python frame>
|
||||||
|
_
|
||||||
|
Current thread's C stack trace (most recent call first):
|
||||||
|
Binary file "/lib64/libpython3.14.so.1.0", at _Py_DumpStack+0x4c [0x7f0dc7b2127b]
|
||||||
|
<truncated rest of calls>
|
||||||
|
"""
|
||||||
|
|
||||||
WINDOWS_CRASH_TEXT = r"""
|
WINDOWS_CRASH_TEXT = r"""
|
||||||
Windows fatal exception: access violation
|
Windows fatal exception: access violation
|
||||||
_
|
_
|
||||||
|
|
@ -45,13 +70,32 @@ Hello world!
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('text, typ, func', [
|
@pytest.mark.parametrize(
|
||||||
(VALID_CRASH_TEXT, 'Segmentation fault', 'testfunc'),
|
"text, typ, func",
|
||||||
(VALID_CRASH_TEXT_THREAD, 'Segmentation fault', 'testfunc'),
|
[
|
||||||
(VALID_CRASH_TEXT_EMPTY, 'Aborted', ''),
|
pytest.param(VALID_CRASH_TEXT, "Segmentation fault", "testfunc", id="valid"),
|
||||||
(WINDOWS_CRASH_TEXT, 'Windows access violation', 'tabopen'),
|
pytest.param(
|
||||||
(INVALID_CRASH_TEXT, '', ''),
|
VALID_CRASH_TEXT_THREAD, "Segmentation fault", "testfunc", id="valid-thread"
|
||||||
])
|
),
|
||||||
|
pytest.param(
|
||||||
|
VALID_CRASH_TEXT_PY314,
|
||||||
|
"Segmentation fault",
|
||||||
|
"qt mainloop",
|
||||||
|
id="valid-py314",
|
||||||
|
),
|
||||||
|
pytest.param(
|
||||||
|
VALID_CRASH_TEXT_PY314_NO_PY,
|
||||||
|
"Segmentation fault",
|
||||||
|
"",
|
||||||
|
id="valid-py314-no-py",
|
||||||
|
),
|
||||||
|
pytest.param(VALID_CRASH_TEXT_EMPTY, "Aborted", "", id="valid-empty"),
|
||||||
|
pytest.param(
|
||||||
|
WINDOWS_CRASH_TEXT, "Windows access violation", "tabopen", id="windows"
|
||||||
|
),
|
||||||
|
pytest.param(INVALID_CRASH_TEXT, "", "", id="invalid"),
|
||||||
|
],
|
||||||
|
)
|
||||||
def test_parse_fatal_stacktrace(text, typ, func):
|
def test_parse_fatal_stacktrace(text, typ, func):
|
||||||
text = text.strip().replace('_', ' ')
|
text = text.strip().replace('_', ' ')
|
||||||
assert crashdialog.parse_fatal_stacktrace(text) == (typ, func)
|
assert crashdialog.parse_fatal_stacktrace(text) == (typ, func)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue