Debugging Self-relocating Programs
System debugger supports source level debugging of self-relocating programs, like u-boot. A self-relocating program is a program which relocates its own code and data sections, during run time. The debug information available in such files doesn't provide details about where the program sections would be relocated to. Due to this reason, you must provide additional information to the debugger, about the address to which program sections will be relocated to. This can be done in two ways.
-
Update the system debugger launch configuration to provide the address to which program sections are relocated.
- Select Run > Debug Configurations to launch the system debugger launch configuration.
- Click the Application tab and select the application you wish to download.
- Select the This is a self-relocating application checkbox.
-
Enter the address to which all the program sections will be relocated in the Relative address to which the program sections are relocated textbox.
-
Launch the debug configuration. When the program sections are relocated during runtime, the debugger will have enough information to support source level debugging of the relocated sections.
Note: This method is supported only when the 'Debug Type' is set to 'Standalone' in the 'Target Setup' tab of the debug configuration. -
Alternatively, you can also use the memmap command in XSDB to provide the address to which the program sections are relocated. memmap command in XSDB can be used to add symbol files to the debugger. This is useful for debuggin the applications which are already running on the target. For example, boot from flash. In case of relocatable .ELF files, you can use the -relocate-section-map option, to provide the relocate address.
xsdb% targets 2 1 APU 2 ARM Cortex-A9 MPCore #0 (Suspended) 3 ARM Cortex-A9 MPCore #1 (Suspended) 4 xc7z020 xsdb% targets 2 xsdb% memmap -reloc 0x3bf37000 -file u-boot xsdb% stop Info: ARM Cortex-A9 MPCore #0 (target 2) Stopped at 0x3ff7b478 (Suspended) xsdb% bt 0 0x3ff7b478 __udelay()+1005809800: lib/time.c, line 91 1 0x3ff7b4ac udelay()+1005809696: lib/time.c, line 104 2 0x3ff5d878 genphy_update_link()+1005809860: drivers/net/phy/phy.c, line 250 3 0x3ff5df84 m88e1118_startup()+1005809712: drivers/net/phy/marvell.c, line 356 4 0x3ff5d154 zynq_gem_init()+1005810192: drivers/net/zynq_gem.c, line 402 5 0x3ff7dc58 eth_init()+1005809720: net/eth.c, line 886 6 0x3ff7e0e4 net_loop()+1005809728: net/net.c, line 407 7 0x3ff46330 netboot_common()+1005809972: common/cmd_net.c, line 230 8 0x3ff46520 do_tftpb()+1005809708: common/cmd_net.c, line 33 9 0x3ff5295c cmd_process()+1005809824: common/command.c, line 493 10 0x3ff5295c cmd_process()+1005809824: common/command.c, line 493 11 0x3ff3b710 run_list_real()+1005811444: common/cli_hush.c, line 1656 12 0x3ff3b710 run_list_real()+1005811444: common/cli_hush.c, line 1656 13 0x3ff3be3c parse_stream_outer()+1005811244: common/cli_hush.c, line 2003 14 0x3ff3be3c parse_stream_outer()+1005811244: common/cli_hush.c, line 2003 15 0x3ff3b008 parse_string_outer()+1005809872: common/cli_hush.c, line 3254 16 0x3ff3b6b8 run_list_real()+1005811356: common/cli_hush.c, line 1617 17 0x3ff3b6b8 run_list_real()+1005811356: common/cli_hush.c, line 1617 18 0x3ff3be3c parse_stream_outer()+1005811244: common/cli_hush.c, line 2003 19 0x3ff3be3c parse_stream_outer()+1005811244: common/cli_hush.c, line 2003 20 0x3ff3afd0 parse_string_outer()+1005809816: common/cli_hush.c, line 3248 21 0x3ff5140c do_run()+1005809740: common/cli.c, line 131 22 0x3ff5295c cmd_process()+1005809824: common/command.c, line 493 23 0x3ff5295c cmd_process()+1005809824: common/command.c, line 493 24 0x3ff3b710 run_list_real()+1005811444: common/cli_hush.c, line 1656 25 0x3ff3b710 run_list_real()+1005811444: common/cli_hush.c, line 1656 26 0x3ff3be3c parse_stream_outer()+1005811244: common/cli_hush.c, line 2003 27 0x3ff3be3c parse_stream_outer()+1005811244: common/cli_hush.c, line 2003 28 0x3ff3b008 parse_string_outer()+1005809872: common/cli_hush.c, line 3254 29 0x3ff3b6b8 run_list_real()+1005811356: common/cli_hush.c, line 1617 30 0x3ff3b6b8 run_list_real()+1005811356: common/cli_hush.c, line 1617 31 0x3ff3be3c parse_stream_outer()+1005811244: common/cli_hush.c, line 2003 32 0x3ff3be3c parse_stream_outer()+1005811244: common/cli_hush.c, line 2003 33 0x3ff3afd0 parse_string_outer()+1005809816: common/cli_hush.c, line 3248 34 0x3ff39ab4 main_loop()+1005809724: common/main.c, line 85 35 0x3ff3c4f4 run_main_loop()+1005809672: common/board_r.c, line 675 36 0x3ff73b54 initcall_run_list()+1005809716: lib/initcall.c, line 27 37 0x3ff3c66c board_init_r()+1005809676: common/board_r.c, line 908 38 0x3ff3837c clbss_l()+1005809688: arch/arm/lib/crt0.S, line 174 39 unknown-pc