grub/grub-core/gdb_grub.in
Glenn Washburn 264cd9e746 gdb: Only connect to remote target once when first sourced
The gdb_grub script was originally meant to be run once when GDB first
starts up via the -x argument. So it runs commands unconditionally
assuming that the script has not been run before. Its nice to be able
to source the script again when developing the script to modify/add
commands. So only run the commands not defined in user-defined commands,
if a variable $runonce has already been set and when those commands have
been run to set $runonce.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2023-03-14 15:40:09 +01:00

109 lines
2.5 KiB
Plaintext

###
### Load debuging information about GNU GRUB 2 modules into GDB
### automatically. Needs readelf, Perl and gmodule.pl script
###
### Has to be launched from the writable and trusted
### directory containing *.image and *.module
###
### $Id: .gdbinit,v 1.1 2006/05/14 11:38:08 lkundrak Exp $
### Lubomir Kundrak <lkudrak@skosi.org>
###
# Add section numbers and addresses to .segments.tmp
define dump_module_sections_helper
set $mod = $arg0
printf "%s", $mod->name
set $segment = $mod->segment
while ($segment)
printf " %i 0x%lx", $segment->section, $segment->addr
set $segment = $segment->next
end
printf "\n"
end
define dump_module_sections
# Set unlimited width so that lines don't get wrapped writing
# to .segments.tmp
with width 0 -- \
with trace-commands off -- \
pipe dump_module_sections_helper $arg0 | sh -c 'cat >>.segments.tmp'
end
document dump_module_sections
Gather information about module whose mod structure was
given for use with match_and_load_symbols
end
# Generate and execute GDB commands and delete temporary files
# afterwards
define match_and_load_symbols
shell perl gmodule.pl <.segments.tmp >.loadsym.gdb
source .loadsym.gdb
shell rm -f .segments.tmp .loadsym.gdb
end
document match_and_load_symbols
Launch script, that matches section names with information
generated by dump_module_sections and load debugging info
apropriately
end
###
define load_module
dump_module_sections $arg0
match_and_load_symbols
end
document load_module
Load debugging information for module given as argument.
end
define load_all_modules
shell rm -f .segments.tmp
set $this = grub_dl_head
while ($this != 0)
dump_module_sections $this
set $this = $this->next
end
if (grub_dl_head != 0)
match_and_load_symbols
end
end
document load_all_modules
Load debugging information for all loaded modules.
end
define runtime_load_module
break grub_dl_add
commands
silent
load_module mod
cont
end
end
document runtime_load_module
Load module symbols at runtime as they are loaded.
end
###
set confirm off
# Note: On EFI and other platforms that load GRUB to an address that is
# determined at runtime, the symbols in kernel.exec will be wrong.
# However, we must start by loading some executable file or GDB will
# fail.
set $platform_efi = $_streq("@platform@", "efi")
if ! $runonce
if $platform_efi
# Only load the executable file, not the symbols
exec-file kernel.exec
else
file kernel.exec
runtime_load_module
end
target remote :1234
set $runonce = 1
end