| #!/usr/bin/env python3 |
| # |
| # Copyright (c) 2020 Intel Corporation |
| # |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| import argparse |
| import binascii |
| import sys |
| |
| |
| COREDUMP_PREFIX_STR = "#CD:" |
| |
| COREDUMP_BEGIN_STR = COREDUMP_PREFIX_STR + "BEGIN#" |
| COREDUMP_END_STR = COREDUMP_PREFIX_STR + "END#" |
| COREDUMP_ERROR_STR = COREDUMP_PREFIX_STR + "ERROR CANNOT DUMP#" |
| |
| |
| def parse_args(): |
| parser = argparse.ArgumentParser() |
| |
| parser.add_argument("infile", help="Serial Log File") |
| parser.add_argument("outfile", |
| help="Output file for use with coredump GDB server") |
| |
| return parser.parse_args() |
| |
| |
| def main(): |
| args = parse_args() |
| |
| infile = open(args.infile, "r") |
| if not infile: |
| print(f"ERROR: Cannot open input file: {args.infile}, exiting...") |
| sys.exit(1) |
| |
| outfile = open(args.outfile, "wb") |
| if not outfile: |
| print(f"ERROR: Cannot open output file for write: {args.outfile}, exiting...") |
| sys.exit(1) |
| |
| print(f"Input file {args.infile}") |
| print(f"Output file {args.outfile}") |
| |
| has_begin = False |
| has_end = False |
| has_error = False |
| go_parse_line = False |
| bytes_written = 0 |
| for line in infile.readlines(): |
| if line.find(COREDUMP_BEGIN_STR) >= 0: |
| # Found "BEGIN#" - beginning of log |
| has_begin = True |
| go_parse_line = True |
| continue |
| |
| if line.find(COREDUMP_END_STR) >= 0: |
| # Found "END#" - end of log |
| has_end = True |
| go_parse_line = False |
| break |
| |
| if line.find(COREDUMP_ERROR_STR) >= 0: |
| # Error was encountered during dumping: |
| # log is not usable |
| has_error = True |
| go_parse_line = False |
| break |
| |
| if not go_parse_line: |
| continue |
| |
| prefix_idx = line.find(COREDUMP_PREFIX_STR) |
| |
| if prefix_idx < 0: |
| continue |
| |
| prefix_idx += len(COREDUMP_PREFIX_STR) |
| hex_str = line[prefix_idx:].strip() |
| |
| binary_data = binascii.unhexlify(hex_str) |
| outfile.write(binary_data) |
| bytes_written += len(binary_data) |
| |
| if not has_begin: |
| print("ERROR: Beginning of log not found!") |
| elif not has_end: |
| print("WARN: End of log not found! Is log complete?") |
| elif has_error: |
| print("ERROR: log has error.") |
| else: |
| print(f"Bytes written {bytes_written}") |
| |
| infile.close() |
| outfile.close() |
| |
| |
| if __name__ == "__main__": |
| main() |