Difference between revisions of "U-Boot - How to debug"

[quality revision] [quality revision]
m
m (Activate debug trace on one file)
Applicable for STM32MP13x lines, STM32MP15x lines

1 Debug with console[edit]

See U-Boot Documentation or doc/README.log for U-Boot logging details.

CONFIG_LOG is enable in OpenSTLinux.

By default, traces are available on the U-Boot console which use stdout-path defined in the chosen node of the Linux kernel device tree as described in the Linux kernel binding[1].

See page How to configure U-Boot for your board for configuration details.

The ST boards use the default logging configuration:

  • CONFIG_LOG_DEFAULT_LEVEL = CONFIG_LOG_MAX_LEVEL = 6 (LOGL_INFO)
    the 'debug' macros used by U-Boot (log_debug(), debug(), pr_debug()...) are removed in the U-Boot binary.
  • CONFIG_LOGF_FILE, CONFIG_LOGF_LINE, CONFIG_LOGF_FUNC are not activated
    no debug information in log messages by default.

To activate all the debug traces in U-Boot you need to set the default logging level - e.g. set CONFIG_LOG_DEFAULT_LEVEL to 7 (LOGL_DEBUG), with a major impact on U-Boot size.

When the traces are present in U-Boot, you can change the default trace level with CONFIG_LOG_DEFAULT_LEVEL or you can use the log command (CONFIG_CMD_LOG) to dynamically configure and filter the output:

 
  log level 7
   log format all

1.1 Activate debug trace on one file[edit]

To turn on this debug logging just in one file, you can define LOG_DEBUG and DEBUG for this file

  • add define before any include in the <file>.c file
 #define LOG_DEBUG
 #define DEBUG

  • with a Makefile
 CFLAGS_<file>.o+= -DLOG_DEBUG  -DDEBUG

1.2 Debug before console[edit]

If U-Boot fails before the console configuration (in the first stage of U-Boot execution), trace is not available.

In this case, you need to:

  • debug with GDB (see the next chapter)

or,

  • activate the debug UART feature:
    • add in defconfig of U-Boot configuration
      • CONFIG_DEBUG_UART
      • CONFIG_DEBUG_UART_STM32
    • adapt the function board_debug_uart_init(): that configures the required resources (pad, clock) before initialization by the U-Boot driver.
      This function needs to be adapted for your board.

2 Debug with GDB[edit]

With OpenSTLinux, you can directly use GDB script Setup.gdb:

Or for manual GDB connection, you need to:

  1. get the elf files for U-Boot = u-boot available in the build directory
  2. connect GDB to the target
  3. reset with attach the target with the gdb "monitor reset halt" command:
    execution is stopped in ROM code or at the beginning of FSBL execution.
  4. load the symbols of the binary to be debugged with commands available in next chapter:
    #Load U-Boot symbol
  5. start execution with the "continue" command

2.1 Load U-Boot symbol[edit]

With U-Boot relocation, symbols are more difficult to load.

See https://www.denx.de/wiki/DULG/DebuggingUBoot

If you connect GDB on running target, you can load the debug symbols:

  • Before relocation with "symbol-file" command:
 
 symbol-file u-boot

  • After relocation with "add-symbol-file" command to relocate the symbol with the code offset = gd->relocaddr:
 
 symbol-file u-boot                            --> only for "gd_t" definition
  set $offset = ((gd_t *)$r9)->relocaddr        --> get relocation offset
  symbol-file                                   --> clear previous symbol 
  add-symbol-file u-boot $offset

The following GDB example script automatically loads the U-Boot symbol before and after relocation for a programmed board, after "monitor reset halt" command:

 
 thbreak *0xC0100000
  commands
 > symbol-file u-boot
 > thbreak relocate_code
 > commands
   > print "RELOCATE U-Boot..."
   > set $offset = ((gd_t *)$r9)->relocaddr
   > print $offset
   > symbol-file
   > add-symbol-file u-boot $offset
   > thbreak boot_jump_linux
   > continue
   > end
 > continue
 > end

This script uses a temporary hardware breakpoint "thbreak" to load the symbol when U-Boot code is loaded in DDR by FSBL = TF-A at the U-Boot entry point, CONFIG_SYS_TEXT_BASE =

  • 0xC0000000 for STM32MP13x lines Warning.png
  • 0xC0100000 for STM32MP15x lines More info.png

It allows the symbol to be loaded only when code is executed to avoid DDR access before DDR initialization.

3 References[edit]

  1. Documentation/devicetree/bindings/chosen.txt the Linux kernel binding for chosen node


<noinclude>{{ApplicableFor
|MPUs list=STM32MP13x, STM32MP15x
|MPUs checklist=STM32MP13x,STM32MP15x
}}</noinclude>

== Debug with console ==

See {{DocSource | domain=U-Boot |path=develop/logging.html | text=U-Boot Documentation}} or {{CodeSource | U-Boot |doc/README.log}} for U-Boot logging details.

CONFIG_LOG is enable in OpenSTLinux.

By default, traces are available on the U-Boot console which use <code>stdout-path</code> defined in the <code>chosen</code> node of the Linux kernel device tree as described in the Linux kernel binding<ref>{{CodeSource | Linux kernel | Documentation/devicetree/bindings/chosen.txt | Documentation/devicetree/bindings/chosen.txt}} the Linux kernel binding for chosen node</ref>.

See page [[How_to_configure_U-Boot_for_your_board#Console|How to configure U-Boot for your board]] for configuration details.

The ST boards use the default logging configuration:
* CONFIG_LOG_DEFAULT_LEVEL = CONFIG_LOG_MAX_LEVEL = 6 (LOGL_INFO)<br/>the 'debug' macros used by U-Boot (log_debug(), debug(), pr_debug()...) are removed in the U-Boot binary.
* CONFIG_LOGF_FILE, CONFIG_LOGF_LINE, CONFIG_LOGF_FUNC are not activated<br/>no debug information in log messages by default.

To activate all the debug traces in U-Boot you need to set the default logging level - e.g. set CONFIG_LOG_DEFAULT_LEVEL to 7 (LOGL_DEBUG), with a major impact on U-Boot size.

When the traces are present in U-Boot, you can change the default trace level with CONFIG_LOG_DEFAULT_LEVEL or you can use the <code>log</code> command (CONFIG_CMD_LOG) to dynamically configure and filter the output:

  {{U-Boot$}}  log level 7
  {{U-Boot$}}  log format all

=== Activate debug trace on one file ===

To turn on this debug logging just in one file, you can define LOG_DEBUG and DEBUG for this file 

* add define before any include in the <file>.c file
  #define LOG_DEBUG #define DEBUG
* with a Makefile
  CFLAGS_<file>.o+= -DLOG_DEBUG  -DDEBUG
=== Debug before console ===

If U-Boot fails before the console configuration (in the first stage of U-Boot execution), trace is not available.

In this case, you need to:
* debug with GDB (see the next chapter)
or,
* activate the debug UART feature:
** add in defconfig of [[U-Boot_overview#U-Boot_configuration|U-Boot configuration]]
*** {{Highlight|CONFIG_DEBUG_UART}}
*** {{Highlight|CONFIG_DEBUG_UART_STM32}}
** adapt the function {{Highlight|board_debug_uart_init()}}: that configures the required resources (pad, clock) before initialization by the U-Boot driver.<br/>This function needs to be adapted for your board.

== Debug with GDB ==

With OpenSTLinux,  you can directly use GDB script Setup.gdb:
* [[GDB#U-Boot_execution_phase]]
* [[GDB#U-Boot_boot_case]]

Or for manual GDB connection, you need to:
# get the [[U-Boot_overview#Output_files|elf files]] for U-Boot = <code>u-boot</code> available in the build directory
# connect [[GDB]] to the target
# '''reset with attach''' the target with the gdb {{Highlight|"monitor reset halt"}} command:<br/>execution is stopped in ROM code or at the beginning of FSBL execution.
# load the symbols of the binary to be debugged with commands available in next chapter:<br/>[[#Load U-Boot symbol]]
# start execution with the {{Highlight|"continue"}} command

=== Load U-Boot symbol ===

With [[U-Boot_overview#U-Boot_phases|U-Boot relocation]], symbols are more difficult to load.

See https://www.denx.de/wiki/DULG/DebuggingUBoot

If you connect GDB on running target, you can load the debug symbols:

* Before relocation with {{Highlight|"symbol-file"}} command:
  {{GDB$}} {{Highlight|symbol-file u-boot}}

* After relocation with {{Highlight|"add-symbol-file"}} command to relocate the symbol with the code offset = gd->relocaddr:
  {{GDB$}} symbol-file u-boot                            {{Highlight|--> only for "gd_t" definition}}
  {{GDB$}} set $offset = ((gd_t *)$r9)->relocaddr        {{Highlight|--> get relocation offset}}
  {{GDB$}} symbol-file                                   {{Highlight|--> clear previous symbol }}
  {{GDB$}} {{Highlight|add-symbol-file u-boot $offset}}

The following GDB example script automatically loads the U-Boot symbol before and after relocation for a programmed board, after {{Highlight|"monitor reset halt"}} command:

  {{GDB$}} thbreak *{{HighlightParam|0xC0100000}}
  {{GDB$}} commands
  > symbol-file u-boot
  > thbreak relocate_code
  > commands
    > print "RELOCATE U-Boot..."
    > set $offset = ((gd_t *)$r9)->relocaddr
    > print $offset
    > symbol-file
    > add-symbol-file u-boot $offset
    > thbreak boot_jump_linux
    > continue
    > end
  > continue
  > end

This script uses a temporary hardware breakpoint {{Highlight|"thbreak"}} to load the symbol when U-Boot code is loaded in DDR by FSBL = TF-A at the U-Boot entry point, CONFIG_SYS_TEXT_BASE =
* {{HighlightParam|0xC0000000}} for {{MicroprocessorDevice | device=13}}
* {{HighlightParam|0xC0100000}} for {{MicroprocessorDevice | device=15}}

It allows the symbol to be loaded only when code is executed to avoid DDR access before DDR initialization.

== References ==<references/>


[[Category:U-Boot|U-Boot - 8]]
[[Category:Tracing tools]]
[[Category:Debugging tools]]
{{PublicationRequestId | 12894 | 2019-08-01}}</noinclude>
Line 26: Line 26:
 
=== Activate debug trace on one file ===
 
=== Activate debug trace on one file ===
   
To turn on this debug logging just in one file, you can define LOG_DEBUG for this file  
+
To turn on this debug logging just in one file, you can define LOG_DEBUG and DEBUG for this file  
   
 
* add define before any include in the <file>.c file
 
* add define before any include in the <file>.c file
 
   #define LOG_DEBUG
 
   #define LOG_DEBUG
  +
  #define DEBUG
   
 
* with a Makefile
 
* with a Makefile
   CFLAGS_<file>.o+= -DLOG_DEBUG
+
   CFLAGS_<file>.o+= -DLOG_DEBUG -DDEBUG
   
 
=== Debug before console ===
 
=== Debug before console ===