-
Notifications
You must be signed in to change notification settings - Fork 36
Expand file tree
/
Copy pathStacktraceHelper.py
More file actions
83 lines (70 loc) · 2.69 KB
/
StacktraceHelper.py
File metadata and controls
83 lines (70 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import os
import subprocess
import glob
import re
import time
from datetime import datetime
from helpers.ConfigHelper import is_windows
def get_core_dumps():
# TODO: find a way to use coredump in windows
if is_windows():
return False
# read coredump location
with open('/proc/sys/kernel/core_pattern', 'r', encoding='utf-8') as f:
coredump_path = f.read().strip('\n')
# yields something like: /tmp/core-*-*-*-*
coredump_file_pattern = re.sub(r'%[a-zA-Z]{1}', '*', coredump_path)
return glob.glob(coredump_file_pattern)
def generate_stacktrace(scenario_title, coredumps):
message = ['###########################################']
message.append(f'Scenario: {scenario_title}')
for coredump_file in coredumps:
message.append(parse_stacktrace(coredump_file))
message.append('###########################################')
message.append('')
stacktrace = '\n'.join(message)
stacktrace_file = os.environ.get('STACKTRACE_FILE', '../stacktrace.log')
# save stacktrace to a file
with open(stacktrace_file, 'a', encoding='utf-8') as f:
f.write(stacktrace)
def parse_stacktrace(coredump_file):
message = []
if coredump_file:
coredump_filename = os.path.basename(coredump_file)
# example coredump file: core-1648445754-1001-11-!drone!src!build-GUI-tests!bin!opencloud
patterns = coredump_filename.split('-')
app_binary = 'opencloud'
if len(patterns) == 1:
patterns.append('N/A')
patterns.append('N/A')
patterns.append('N/A')
else:
app_binary = '-'.join(patterns[4:]).replace('!', '/')
timestamp = datetime.fromtimestamp(
float(patterns[1] if patterns[1] != 'N/A' else time.time())
)
message.append('-------------------------------------------')
message.append(f'Executable: {app_binary}')
message.append(f'Timestamp: {str(timestamp)}')
message.append(f'Process ID: {patterns[2]}')
message.append(f'Signal Number: {patterns[3]}')
message.append('-------------------------------------------')
message.append('<<<<< STACKTRACE START >>>>>')
message.append(
subprocess.run(
[
'gdb',
app_binary,
coredump_file,
'-batch',
'-ex',
'bt full',
],
stdout=subprocess.PIPE,
check=False,
).stdout.decode('utf-8')
)
message.append('<<<<< STACKTRACE END >>>>>')
# remove coredump file
os.unlink(coredump_file)
return '\n'.join(message)