GDB monitor: move GDB commands into separate file

This patch moves the GDB commands to set a breakpoint in the 'main()'
function into a separate file that can be included from other run scripts.

Fixes #876.
This commit is contained in:
Christian Prochaska 2013-09-04 12:25:28 +02:00 committed by Norman Feske
parent 3ca14f53fe
commit 5b8965cde9
3 changed files with 62 additions and 76 deletions

50
ports/run/gdb_monitor.inc Normal file
View File

@ -0,0 +1,50 @@
#
# \brief GDB command line arguments for setting a breakpoint in the 'main()' function
# \author Christian Prochaska
# \date 2013-09-04
#
proc gdb_main_breakpoint_cmds { target_binary_name } {
#
# We set a break in the 'main()' function of a dynamically linked
# application by using the following gdb command sequence. It's important that
# the 'main()' breakpoint gets set before the 'sharedlibrary' command is
# executed. Otherwise the breakpoint would get set in ld.lib.so's main()
# function.
#
set gdb_cmds ""
# don't ask for y/n when loading a new symbol file
append gdb_cmds {-ex "set interactive-mode off" }
# load the symbols of ld.lib.so
append gdb_cmds {-ex "symbol-file bin/ld.lib.so" }
# set a breakpoint in the 'call_main()' function
append gdb_cmds {-ex "b call_main" }
# continue execution until the breakpoint triggers
append gdb_cmds {-ex "c" }
# delete the 'call_main()' breakpoint
append gdb_cmds {-ex "delete 1" }
# load the symbols of the test application
append gdb_cmds "-ex \"symbol-file bin/$target_binary_name\" "
# set a breakpoint in the application's 'main()' function
append gdb_cmds {-ex "b main" }
# load the symbols of loaded shared libraries
append gdb_cmds {-ex "sharedlibrary" }
# continue execution until the breakpoint triggers
append gdb_cmds {-ex "c" }
# delete the 'main()' breakpoint
append gdb_cmds {-ex "delete 2" }
return $gdb_cmds
}

View File

@ -107,47 +107,15 @@ run_genode_until {.*Remote debugging using /dev/terminal.*} 30
puts "GDB monitor is up, starting GDB"
source ${genode_dir}/ports/run/gdb_monitor.inc
set gdb_target_binary "test-gdb_monitor"
# sequence of GDB commands to execute at startup
set gdb_cmds ""
append gdb_cmds {-ex "target remote localhost:$local_port" }
#
# The test breaks into the 'main()' function of the dynamically linked test
# application by using the following gdb command sequence. It's important that
# the 'main()' breakpoint gets set before the 'sharedlibrary' command is
# executed. Otherwise the breakpoint would get set in ld.lib.so's main()
# function.
#
# don't ask for y/n when loading a new symbol file
append gdb_cmds {-ex "set interactive-mode off" }
# load the symbols of ld.lib.so
append gdb_cmds {-ex "symbol-file bin/ld.lib.so" }
# set a breakpoint in the 'call_main()' function
append gdb_cmds {-ex "b call_main" }
# continue execution until the breakpoint triggers
append gdb_cmds {-ex "c" }
# delete the 'call_main()' breakpoint
append gdb_cmds {-ex "delete 1" }
# load the symbols of the test application
append gdb_cmds {-ex "symbol-file bin/test-gdb_monitor" }
# set a breakpoint in the application's 'main()' function
append gdb_cmds {-ex "b main" }
# load the symbols of loaded shared libraries
append gdb_cmds {-ex "sharedlibrary" }
# continue execution until the breakpoint triggers
append gdb_cmds {-ex "c" }
# delete the 'main()' breakpoint
append gdb_cmds {-ex "delete 2" }
append gdb_cmds [gdb_main_breakpoint_cmds $gdb_target_binary]
#
# Test commands
@ -179,7 +147,7 @@ append gdb_cmds {-ex "bt" }
append gdb_cmds {-ex "q" }
# run GDB and redirect stderr to stdio to get the relevant output into the expect buffer
eval spawn [gdb] bin/test-gdb_monitor -batch $gdb_cmds 2&>1
eval spawn [gdb] bin/$gdb_target_binary -batch $gdb_cmds 2&>1
set timeout 60
expect {

View File

@ -97,52 +97,20 @@ run_genode_until {.*Remote debugging using /dev/terminal.*} 30
puts "GDB monitor is up, starting GDB in a new terminal"
source ${genode_dir}/ports/run/gdb_monitor.inc
set gdb_target_binary "test-gdb_monitor"
# sequence of GDB commands to execute at startup
set gdb_cmds ""
append gdb_cmds "-ex \"target remote localhost:$local_port\" "
#
# The test breaks into the 'main()' function of the dynamically linked test
# application by using the following gdb command sequence. It's important that
# the 'main()' breakpoint gets set before the 'sharedlibrary' command is
# executed. Otherwise the breakpoint would get set in ld.lib.so's main()
# function.
#
# don't ask for y/n when loading a new symbol file
append gdb_cmds {-ex "set interactive-mode off" }
# load the symbols of ld.lib.so
append gdb_cmds {-ex "symbol-file bin/ld.lib.so" }
# set a breakpoint in the 'call_main()' function
append gdb_cmds {-ex "b call_main" }
# continue execution until the breakpoint triggers
append gdb_cmds {-ex "c" }
# delete the 'call_main()' breakpoint
append gdb_cmds {-ex "delete 1" }
# load the symbols of the test application
append gdb_cmds {-ex "symbol-file bin/test-gdb_monitor" }
# set a breakpoint in the application's 'main()' function
append gdb_cmds {-ex "b main" }
# load the symbols of loaded shared libraries
append gdb_cmds {-ex "sharedlibrary" }
# continue execution until the breakpoint triggers
append gdb_cmds {-ex "c" }
# delete the 'main()' breakpoint
append gdb_cmds {-ex "delete 2" }
append gdb_cmds [gdb_main_breakpoint_cmds $gdb_target_binary]
# ask the user for confirmations again
append gdb_cmds {-ex "set interactive-mode auto" }
puts "command: [gdb] bin/test-gdb_monitor $gdb_cmds"
puts "command: [gdb] bin/$gdb_target_binary $gdb_cmds"
exec [terminal] -e "[gdb] bin/test-gdb_monitor $gdb_cmds" &