mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
78 lines
2.2 KiB
Python
Executable File
78 lines
2.2 KiB
Python
Executable File
#!/usr/bin/env python
|
|
#
|
|
# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
|
|
import json
|
|
import logging
|
|
import os.path
|
|
from typing import Any
|
|
|
|
try:
|
|
from esp_coredump import CoreDump
|
|
except ImportError:
|
|
raise ModuleNotFoundError('No module named "esp_coredump" please install esp_coredump by running '
|
|
'"python -m pip install esp-coredump"')
|
|
|
|
from esp_coredump.cli_ext import parser
|
|
|
|
|
|
def get_prefix_map_gdbinit_path(prog_path): # type: (str) -> Any
|
|
build_dir = os.path.abspath(os.path.dirname(prog_path))
|
|
desc_path = os.path.abspath(os.path.join(build_dir, 'project_description.json'))
|
|
if not os.path.isfile(desc_path):
|
|
logging.warning('%s does not exist. Please build the app with "idf.py build"', desc_path)
|
|
return ''
|
|
|
|
with open(desc_path, 'r') as f:
|
|
project_desc = json.load(f)
|
|
|
|
return project_desc.get('debug_prefix_map_gdbinit')
|
|
|
|
|
|
def main(): # type: () -> None
|
|
args = parser.parse_args()
|
|
|
|
if args.debug == 0:
|
|
log_level = logging.CRITICAL
|
|
elif args.debug == 1:
|
|
log_level = logging.ERROR
|
|
elif args.debug == 2:
|
|
log_level = logging.WARNING
|
|
elif args.debug == 3:
|
|
log_level = logging.INFO
|
|
else:
|
|
log_level = logging.DEBUG
|
|
logging.basicConfig(format='%(levelname)s: %(message)s', level=log_level)
|
|
|
|
kwargs = {k: v for k, v in vars(args).items() if v is not None}
|
|
# pass the extra_gdbinit_file if the build is reproducible
|
|
kwargs['extra_gdbinit_file'] = get_prefix_map_gdbinit_path(kwargs['prog'])
|
|
|
|
del(kwargs['debug'])
|
|
del(kwargs['operation'])
|
|
|
|
espcoredump = CoreDump(**kwargs)
|
|
temp_core_files = None
|
|
|
|
try:
|
|
if args.operation == 'info_corefile':
|
|
temp_core_files = espcoredump.info_corefile()
|
|
elif args.operation == 'dbg_corefile':
|
|
temp_core_files = espcoredump.dbg_corefile()
|
|
else:
|
|
raise ValueError('Please specify action, should be info_corefile or dbg_corefile')
|
|
finally:
|
|
if temp_core_files:
|
|
for f in temp_core_files:
|
|
try:
|
|
os.remove(f)
|
|
except OSError:
|
|
pass
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|