espcoredump.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #!/usr/bin/env python
  2. #
  3. # SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
  4. #
  5. # SPDX-License-Identifier: Apache-2.0
  6. #
  7. import json
  8. import logging
  9. import os.path
  10. from typing import Any
  11. try:
  12. from esp_coredump import CoreDump
  13. except ImportError:
  14. raise ModuleNotFoundError('No module named "esp_coredump" please install esp_coredump by running '
  15. '"python -m pip install esp-coredump"')
  16. from esp_coredump.cli_ext import parser
  17. def get_prefix_map_gdbinit_path(prog_path): # type: (str) -> Any
  18. build_dir = os.path.abspath(os.path.dirname(prog_path))
  19. desc_path = os.path.abspath(os.path.join(build_dir, 'project_description.json'))
  20. if not os.path.isfile(desc_path):
  21. logging.warning('%s does not exist. Please build the app with "idf.py build"', desc_path)
  22. return ''
  23. with open(desc_path, 'r') as f:
  24. project_desc = json.load(f)
  25. return project_desc.get('debug_prefix_map_gdbinit')
  26. def main(): # type: () -> None
  27. args = parser.parse_args()
  28. if args.debug == 0:
  29. log_level = logging.CRITICAL
  30. elif args.debug == 1:
  31. log_level = logging.ERROR
  32. elif args.debug == 2:
  33. log_level = logging.WARNING
  34. elif args.debug == 3:
  35. log_level = logging.INFO
  36. else:
  37. log_level = logging.DEBUG
  38. logging.basicConfig(format='%(levelname)s: %(message)s', level=log_level)
  39. kwargs = {k: v for k, v in vars(args).items() if v is not None}
  40. # pass the extra_gdbinit_file if the build is reproducible
  41. kwargs['extra_gdbinit_file'] = get_prefix_map_gdbinit_path(kwargs['prog'])
  42. del kwargs['debug']
  43. del kwargs['operation']
  44. espcoredump = CoreDump(**kwargs)
  45. temp_core_files = None
  46. try:
  47. if args.operation == 'info_corefile':
  48. temp_core_files = espcoredump.info_corefile()
  49. elif args.operation == 'dbg_corefile':
  50. temp_core_files = espcoredump.dbg_corefile()
  51. else:
  52. raise ValueError('Please specify action, should be info_corefile or dbg_corefile')
  53. finally:
  54. if temp_core_files:
  55. for f in temp_core_files:
  56. try:
  57. os.remove(f)
  58. except OSError:
  59. pass
  60. if __name__ == '__main__':
  61. main()