mirror of https://github.com/ByConity/ByConity
85 lines
2.5 KiB
Python
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)
|