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>
109 lines
2.5 KiB
Plaintext
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
|