# # \brief Example for debugging a service # \author Norman Feske # \date 2011-09-13 # # This example shows how GDB monitor can be used to debug a Genode service. # GDB monitor sits in between the service and the service's parent. Any # service announcements are transparently propagated through the GDB # monitor to the parent. This way, the internal state of a service can # be observed at any time via a remote GDB connection. In the example, # the remote GDB connection is realized via an UART device. Alternatively, # 'tcp_terminal' could be used (to attach GDB via a network connection). # if {![have_include "power_on/qemu"] || !([have_spec nova])} { puts "Run script is only supported for NOVA in Qemu"; exit 0 } create_boot_directory import_from_depot [depot_user]/src/[base_src] \ [depot_user]/pkg/[drivers_interactive_pkg] \ [depot_user]/src/nitpicker \ [depot_user]/src/demo \ [depot_user]/src/init set build_components { drivers/uart app/gdb_monitor test/gdb_monitor } lappend build_components "lib/gdbserver_platform-$::env(KERNEL)" build $build_components install_config { } # evaluated by the run tool proc binary_name_gdbserver_platform_lib_so { } { return "gdbserver_platform-$::env(KERNEL).lib.so" } # generic modules build_boot_image { stdcxx.lib.so libc.lib.so libm.lib.so vfs.lib.so libc_pipe.lib.so pc_uart_drv gdb_monitor gdbserver_platform.lib.so } # # Execute test case # # set local_port 5555 # qemu config # connect comport 0 to stdio append qemu_args " -serial mon:stdio " # connect comport 1 with TCP port $local_port append qemu_args " -serial chardev:uart " append qemu_args " -chardev socket,id=uart,port=$local_port,host=localhost,server,nowait,ipv4 " run_genode_until {.*\[init -> gdb_monitor\].*} 30 puts "GDB monitor is up, starting GDB in a new terminal" source ${genode_dir}/repos/ports/run/gdb_monitor.inc # GDB loads symbols from 'debug/ld.lib.so' if { [have_spec nova] } { exec ln -sf ld-nova.lib.so debug/ld.lib.so } if { [have_spec foc] } { exec ln -sf ld-foc.lib.so debug/ld.lib.so } set gdb_target_binary "nitpicker" # sequence of GDB commands to execute at startup set gdb_cmds "" append gdb_cmds "-ex \"target remote localhost:$local_port\" " append gdb_cmds [gdb_initial_breakpoint_cmds $gdb_target_binary] # ask the user for confirmations again append gdb_cmds {-ex "set interactive-mode auto" } puts "command: [gdb] debug/ld.lib.so $gdb_cmds" exec [terminal] -e "[gdb] debug/ld.lib.so $gdb_cmds" & interact -i [output_spawn_id] # vi: set ft=tcl :