idf.py gdb: autoload prefix_map_gdbinit when exists in project_description.json

This commit is contained in:
Fu Hanxi 2021-10-26 10:41:13 +08:00
parent ea1005b740
commit 42405604af
4 changed files with 25 additions and 17 deletions

View File

@ -151,6 +151,8 @@ if(NOT ${CMAKE_C_COMPILER_VERSION} VERSION_LESS 8.0.0)
endif() endif()
if(CONFIG_APP_REPRODUCIBLE_BUILD) if(CONFIG_APP_REPRODUCIBLE_BUILD)
idf_build_set_property(DEBUG_PREFIX_MAP_GDBINIT "${BUILD_DIR}/prefix_map_gdbinit")
list(APPEND compile_options "-fdebug-prefix-map=${IDF_PATH}=/IDF") list(APPEND compile_options "-fdebug-prefix-map=${IDF_PATH}=/IDF")
list(APPEND compile_options "-fdebug-prefix-map=${PROJECT_DIR}=/IDF_PROJECT") list(APPEND compile_options "-fdebug-prefix-map=${PROJECT_DIR}=/IDF_PROJECT")
list(APPEND compile_options "-fdebug-prefix-map=${BUILD_DIR}=/IDF_BUILD") list(APPEND compile_options "-fdebug-prefix-map=${BUILD_DIR}=/IDF_BUILD")

View File

@ -111,6 +111,7 @@ function(__project_info test_components)
include(${sdkconfig_cmake}) include(${sdkconfig_cmake})
idf_build_get_property(COMPONENT_KCONFIGS KCONFIGS) idf_build_get_property(COMPONENT_KCONFIGS KCONFIGS)
idf_build_get_property(COMPONENT_KCONFIGS_PROJBUILD KCONFIG_PROJBUILDS) idf_build_get_property(COMPONENT_KCONFIGS_PROJBUILD KCONFIG_PROJBUILDS)
idf_build_get_property(debug_prefix_map_gdbinit DEBUG_PREFIX_MAP_GDBINIT)
# Write project description JSON file # Write project description JSON file
idf_build_get_property(build_dir BUILD_DIR) idf_build_get_property(build_dir BUILD_DIR)

View File

@ -18,5 +18,5 @@
}, },
"build_components" : ${build_components_json}, "build_components" : ${build_components_json},
"build_component_paths" : ${build_component_paths_json}, "build_component_paths" : ${build_component_paths_json},
"debug_prefix_map_gdbinit": "${BUILD_DIR}/prefix_map_gdbinit" "debug_prefix_map_gdbinit": "${debug_prefix_map_gdbinit}"
} }

View File

@ -7,6 +7,7 @@ import sys
import threading import threading
import time import time
from threading import Thread from threading import Thread
from typing import Any, Dict, List
from idf_py_actions.errors import FatalError from idf_py_actions.errors import FatalError
from idf_py_actions.tools import ensure_build_directory from idf_py_actions.tools import ensure_build_directory
@ -83,19 +84,6 @@ def action_extensions(base_actions, project_path):
print('Failed to close/kill {}'.format(target)) print('Failed to close/kill {}'.format(target))
processes[target] = None # to indicate this has ended processes[target] = None # to indicate this has ended
def _get_commandline_options(ctx):
""" Return all the command line options up to first action """
# This approach ignores argument parsing done Click
result = []
for arg in sys.argv:
if arg in ctx.command.commands_with_aliases:
break
result.append(arg)
return result
def create_local_gdbinit(gdbinit, elf_file): def create_local_gdbinit(gdbinit, elf_file):
with open(gdbinit, 'w') as f: with open(gdbinit, 'w') as f:
if os.name == 'nt': if os.name == 'nt':
@ -188,6 +176,13 @@ def action_extensions(base_actions, project_path):
processes['openocd_outfile_name'] = openocd_out_name processes['openocd_outfile_name'] = openocd_out_name
print('OpenOCD started as a background task {}'.format(process.pid)) print('OpenOCD started as a background task {}'.format(process.pid))
def get_gdb_args(gdbinit, project_desc: Dict[str, Any]) -> List[str]:
args = ['-x={}'.format(gdbinit)]
debug_prefix_gdbinit = project_desc.get('debug_prefix_map_gdbinit')
if debug_prefix_gdbinit:
args.append('-ix={}'.format(debug_prefix_gdbinit))
return args
def gdbui(action, ctx, args, gdbgui_port, gdbinit, require_openocd): def gdbui(action, ctx, args, gdbgui_port, gdbinit, require_openocd):
""" """
Asynchronous GDB-UI target Asynchronous GDB-UI target
@ -198,7 +193,17 @@ def action_extensions(base_actions, project_path):
if gdbinit is None: if gdbinit is None:
gdbinit = os.path.join(local_dir, 'gdbinit') gdbinit = os.path.join(local_dir, 'gdbinit')
create_local_gdbinit(gdbinit, os.path.join(args.build_dir, project_desc['app_elf'])) create_local_gdbinit(gdbinit, os.path.join(args.build_dir, project_desc['app_elf']))
args = ['gdbgui', '-g', gdb, '--gdb-args="-x={}"'.format(gdbinit)]
# this is a workaround for gdbgui
# gdbgui is using shlex.split for the --gdb-args option. When the input is:
# - '"-x=foo -x=bar"', would return ['foo bar']
# - '-x=foo', would return ['-x', 'foo'] and mess up the former option '--gdb-args'
# so for one item, use extra double quotes. for more items, use no extra double quotes.
gdb_args = get_gdb_args(gdbinit, project_desc)
gdb_args = '"{}"'.format(' '.join(gdb_args)) if len(gdb_args) == 1 else ' '.join(gdb_args)
args = ['gdbgui', '-g', gdb, '--gdb-args', gdb_args]
print(args)
if gdbgui_port is not None: if gdbgui_port is not None:
args += ['--port', gdbgui_port] args += ['--port', gdbgui_port]
gdbgui_out_name = os.path.join(local_dir, GDBGUI_OUT_FILE) gdbgui_out_name = os.path.join(local_dir, GDBGUI_OUT_FILE)
@ -278,10 +283,10 @@ def action_extensions(base_actions, project_path):
if gdbinit is None: if gdbinit is None:
gdbinit = os.path.join(local_dir, 'gdbinit') gdbinit = os.path.join(local_dir, 'gdbinit')
create_local_gdbinit(gdbinit, elf_file) create_local_gdbinit(gdbinit, elf_file)
args = [gdb, '-x={}'.format(gdbinit)] args = [gdb, *get_gdb_args(gdbinit, project_desc)]
if gdb_tui is not None: if gdb_tui is not None:
args += ['-tui'] args += ['-tui']
t = Thread(target=run_gdb, args=(args, )) t = Thread(target=run_gdb, args=(args,))
t.start() t.start()
while True: while True:
try: try: