Skip to content

Commit e6eea25

Browse files
authored
signal info for coredump (#12011)
1 parent 8110413 commit e6eea25

File tree

1 file changed

+42
-5
lines changed

1 file changed

+42
-5
lines changed

ydb/deploy/docker/breakpad/minidump_script.py

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,37 @@
33
import json
44
import subprocess
55
import argparse
6+
import signal
67
import os
78

9+
10+
def signal_info(minidump_text):
11+
minidump_lines = minidump_text.splitlines()
12+
13+
signal_name = "UNKNOWN"
14+
signal_str = "no description"
15+
for line in minidump_lines:
16+
line = line.strip()
17+
if line.startswith('Crash|'):
18+
# "Crash|SIGSEGV|0x452e|0"
19+
signal_name = line.split('|')[1]
20+
break
21+
22+
try:
23+
signal_code = getattr(signal, signal_name)
24+
print(f"Signal name '{signal_name}' corresponds to signal number {signal_code}.")
25+
except AttributeError:
26+
print(f"Signal name '{signal_name}' is not a valid signal.")
27+
else:
28+
try:
29+
signal_str = signal.strsignal(signal_code)
30+
print(f"Signal code '{signal_code}' corresponds to signal description {signal_str}.")
31+
except ValueError:
32+
print(f"Signal code '{signal_code}' is not a valid value.")
33+
34+
return "Program terminated with signal {}, {}.".format(signal_name, signal_str)
35+
36+
837
if __name__ == "__main__":
938
parser = argparse.ArgumentParser(
1039
description="Minidump files processing"
@@ -21,25 +50,33 @@
2150
elf_cmd = ["readelf", "-n", "/opt/ydb/bin/ydbd"]
2251
svnrev_cmd = ["/opt/ydb/bin/ydbd", "--svnrevision"]
2352
mndmp_cmd = ["/usr/bin/minidump-2-core", "-v", dmp_file, "-o", core_file]
53+
stwlk_cmd = ["/usr/bin/minidump_stackwalk", "-m", dmp_file]
2454
gdb_cmd = [
2555
"/usr/bin/gdb",
2656
"-q",
2757
"-batch",
2858
"-iex=set auto-load safe-path /",
29-
"-iex=set print thread-events off",
30-
"-ex=backtrace",
3159
"-ex=thread apply all bt",
3260
"/opt/ydb/bin/ydbd",
3361
core_file,
3462
]
3563

3664
elf_resp = subprocess.check_output(elf_cmd).decode("utf-8")
3765
svnrev_resp = subprocess.check_output(svnrev_cmd).decode("utf-8")
38-
subprocess.run(mndmp_cmd)
39-
gdb_resp = subprocess.check_output(gdb_cmd).decode("utf-8")
66+
67+
subprocess.run(mndmp_cmd, stderr=subprocess.DEVNULL)
68+
stwlk_resp = subprocess.check_output(stwlk_cmd, stderr=subprocess.DEVNULL).decode("utf-8")
69+
gdb_resp = subprocess.check_output(gdb_cmd, stderr=subprocess.DEVNULL).decode("utf-8")
70+
stacktrace = []
71+
for line in gdb_resp.splitlines():
72+
stacktrace.append(line)
73+
if line.startswith("Core was generated"):
74+
stacktrace.append(signal_info(stwlk_resp))
75+
stacktrace_str = '\n'.join(stacktrace)
76+
4077
os.remove(dmp_file)
4178
os.remove(core_file)
4279

43-
ret = json.dumps({"binary": "/opt/ydb/bin/ydbd", "readelf": elf_resp, "svnrevision": svnrev_resp, "stacktrace": gdb_resp})
80+
ret = json.dumps({"binary": "/opt/ydb/bin/ydbd", "readelf": elf_resp, "svnrevision": svnrev_resp, "stacktrace": stacktrace_str})
4481
with open(json_file,"w") as out:
4582
out.write(ret)

0 commit comments

Comments
 (0)