ByConity/ci_scripts/common_component/extract_gdb_log.py

85 lines
2.5 KiB
Python

import argparse
def rule_get_core_was_generated_by(string, extracted_log, gdb_full_log):
"""
extract below in gdb info:
Core was generated by `clickhouse client --send_logs_level=debug --database=test_7 --log_comment='/usr'.
Program terminated with signal SIGABRT, Aborted.
#0 0x00007f2752d4800b in raise () from /lib/x86_64-linux-gnu/libc.so.6
"""
if "Core was generated by" in string:
extracted_log.append(string)
extracted_log.append(next(gdb_full_log))
extracted_log.append(next(gdb_full_log))
return next(gdb_full_log), extracted_log, gdb_full_log,
return string, extracted_log, gdb_full_log
def rule_remove_log_before_terminate(lst):
result = []
enable_append = False
for index, string in enumerate(lst):
if "terminate()" in string:
enable_append = True
result.append('...\n')
if enable_append:
result.append(string)
if result:
return result
else:
return lst
def rule_get_hash_one(string, extracted_log, gdb_full_log):
if string.startswith('#1'):
starts_with_hash_lst = [string]
while True:
string = next(gdb_full_log, None)
if not string:
break
if string.startswith('#'):
starts_with_hash_lst.append(string)
else:
break
return string, (extracted_log + rule_remove_log_before_terminate(starts_with_hash_lst)), gdb_full_log
else:
return string, extracted_log, gdb_full_log
def main(args):
extracted_log = ['**' + args.log_path + '**' + '\n']
with open(args.log_path, 'r') as log:
gdb_full_log = iter(log.readlines())
while True:
string = next(gdb_full_log, None)
if not string:
break
string, extracted_log, gdb_full_log = rule_get_core_was_generated_by(string, extracted_log, gdb_full_log)
string, extracted_log, gdb_full_log = rule_get_hash_one(string, extracted_log, gdb_full_log)
if len(extracted_log) > 1:
extracted_log = extracted_log[0:int(args.max_line)]
with open(args.log_path + '.gdb_info_extracted', 'w') as log_cleaned:
log_cleaned.writelines(extracted_log)
log_cleaned.write('\n')
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="extract a few lines in gdb log")
parser.add_argument("--log-path")
parser.add_argument("--max-line", default=10)
args = parser.parse_args()
main(args)