trace_mtb.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #!/usr/bin/env python3
  2. #
  3. # MTB parser script
  4. #
  5. # Copyright (c) 2024 Actions Semiconductor Co., Ltd
  6. #
  7. # SPDX-License-Identifier: Apache-2.0
  8. #
  9. import os
  10. import sys
  11. import argparse
  12. import struct
  13. import subprocess
  14. import re
  15. ADDR2LINE_EXE = "gcc-arm-none-eabi-9-2020-q2-update-win32\\bin\\arm-none-eabi-addr2line.exe"
  16. def addr2line(elf_file, addr_list):
  17. tool = os.path.join(os.environ.get('ZEPHYR_TOOLS'),ADDR2LINE_EXE)
  18. cmd = [tool, "-e", elf_file, "-a", "-f", "-p"] + addr_list
  19. p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  20. output, _ = p.communicate()
  21. return output.decode()
  22. def log2bin(mtb_log, mtb_bin):
  23. pattern = r'.*31000..0:'
  24. with open(mtb_log, 'r') as f1, open(mtb_bin, 'wb') as f2:
  25. for line in f1:
  26. if re.match(pattern, line):
  27. index = line.rfind(":")
  28. mtb_list = line[index+1:-1].split()
  29. for str in mtb_list:
  30. mtb_data = struct.pack("<I", int(str, 16))
  31. f2.write(mtb_data)
  32. def mtb_parse_bin(elf_file, mtb_bin):
  33. addr_list = []
  34. with open(mtb_bin, 'rb') as f1:
  35. while True:
  36. mtb_data = f1.read(8)
  37. if len(mtb_data) < 8:
  38. # output addr2line
  39. if len(addr_list) > 0:
  40. print(addr2line(elf_file, addr_list))
  41. return (0)
  42. src_addr, dst_addr = struct.unpack("<II", mtb_data)
  43. if (src_addr & 0x01) > 0:
  44. # output addr2line
  45. if len(addr_list) > 0:
  46. print(addr2line(elf_file, addr_list))
  47. addr_list = []
  48. print("=" * 64)
  49. addr_list.append(hex(src_addr))
  50. addr_list.append(hex(dst_addr))
  51. return (0)
  52. def mtb_parse_log(elf_file, mtb_log):
  53. mtb_bin = "tmp.bin"
  54. log2bin(mtb_log, mtb_bin)
  55. mtb_parse_bin(elf_file, mtb_bin)
  56. if os.path.exists(mtb_bin):
  57. os.remove(mtb_bin)
  58. return (0)
  59. def main(argv):
  60. parser = argparse.ArgumentParser(
  61. description='mtb parser (bin/log file)',
  62. )
  63. parser.add_argument('-e', dest = 'elf_file')
  64. parser.add_argument('-b', dest = 'mtb_bin')
  65. parser.add_argument('-l', dest = 'mtb_log')
  66. args = parser.parse_args()
  67. if not args.elf_file:
  68. parser.print_help()
  69. sys.exit(1)
  70. if args.mtb_bin:
  71. mtb_parse_bin(args.elf_file, args.mtb_bin)
  72. if args.mtb_log:
  73. mtb_parse_log(args.elf_file, args.mtb_log)
  74. return 0
  75. if __name__ == '__main__':
  76. main(sys.argv[1:])