Desenvolvendo em Linux para FRDM-KL25Z – Debug

Publicado: 13 mar 2014 em Tech
Tags:, , , ,

english

Tópicos:

  1. Introdução
  2. Ferramentas
  3. Compilação
  4. Gravação
  5. Debug

Anteriormente em Gravação, um aplicativo de piscagem de led foi gravado na placa FRDM-KL25Z para execução. Aqui nós usaremos o GNU debugger para debugar esse aplicativo durante sua execução.

Construa um debugger cruzado para ARM

localhost ~ # crossdev --ex-gdb -t arm-none-eabi
...

Isso deve deixar no seu sistema Gentoo um gdb cruzado para a arquitetura pretendida:

localhost ~ # arm-none-eabi-gdb -ex quit
Python Exception  name 'os' is not defined: 

warning: 
Could not load the Python gdb module from `/usr/share/gdb/python'.
Limited Python support is available from the _gdb module.
Suggest passing --data-directory=/path/to/gdb/data-directory.

GNU gdb (Gentoo 7.7 vanilla) 7.7
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-pc-linux-gnu --target=arm-none-eabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
.
Find the GDB manual and other documentation resources online at:
.
For help, type "help".
Type "apropos word" to search for commands related to "word".

Use o OpenOCD como um remoto para o gdb

O OpenOCD tem a habilidade de servir como o lado remoto de uma sessão gdb, permitindo que comandos de debug sejam enviados ao on-chip debugger da placa. O Makefile dos fontes do frdm-kl25z-blink3 possui um alvo para ativar uma sessão gdb com o openocd como remoto para debugar o aplicativo frdm_kl25z_blink3:

user@localhost /tmp/frdm-kl25z-blink3-1.0 $ make debug
arm-none-eabi-gdb -ex "target remote | openocd -c \"gdb_port pipe; log_output debug.log; interface cmsis-dap\"
 -f ./support/openocd/kl25_init.cfg" -ex "monitor reset init" -ex "break main" -ex "continue" frdm_kl25z_blink3
Python Exception  name 'os' is not defined: 

warning: 
Could not load the Python gdb module from `/usr/share/gdb/python'.
Limited Python support is available from the _gdb module.
Suggest passing --data-directory=/path/to/gdb/data-directory.

GNU gdb (Gentoo 7.7 vanilla) 7.7
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-pc-linux-gnu --target=arm-none-eabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
.
Find the GDB manual and other documentation resources online at:
.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from frdm_kl25z_blink3...done.
Remote debugging using | openocd -c "gdb_port pipe; log_output debug.log; interface cmsis-dap" -f ./support/openocd/kl25_init.cfg
Open On-Chip Debugger 0.8.0-dev-00350-g6c74255 (2014-02-14-16:00)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.sourceforge.net/doc/doxygen/bugs.html
warning: Can not parse XML target description; XML support was disabled at compile time
0x00000000 in __vect_table ()
target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x00002038 msp: 0x20003000
Breakpoint 1 at 0x2114: file Sources/ProcessorExpert.c, line 53.
Continuing.

Breakpoint 1, main () at Sources/ProcessorExpert.c:53
53        PE_low_level_init();
(gdb)

Conforme programado, o alvo de debug deverá reiniciar a execução do aplicativo e parar na função main() devido a um breakpoint. Então neste estado a execução está parada (o led RGB para de piscar) e o gdb está aguardando por comandos de debug.

Debug 🙂

Bem, é o gdb; sinta-se livre para fuçar e ter um debug esclarecedor. O que vem a seguir é um exemplo de investigação da função de tratamento de interrupção do timer, que é onde ocorre a virada de cores do led:

(gdb) clear
Deleted breakpoint 1 
(gdb) break LEDTimer_OnInterrupt
Breakpoint 2 at 0x2078: file Sources/Events.c, line 80.
(gdb) continue
Continuing.

Breakpoint 2, LEDTimer_OnInterrupt (UserDataPtr=0x0 ) at Sources/Events.c:80
80              switch (led_state++) {
(gdb) list
75      /* ===================================================================*/
76      void LEDTimer_OnInterrupt(LDD_TUserData *UserDataPtr)
77      {
78        /* Write your code here ... */
79              static int led_state = 0;
80              switch (led_state++) {
81              case 0:
82                      RedLED_SetVal(RedLED_DeviceData);
83                      GreenLED_SetVal(GreenLED_DeviceData);
84                      BlueLED_SetVal(BlueLED_DeviceData);
(gdb) display led_state
1: led_state = 0
(gdb) continue
Continuing.

Breakpoint 2, LEDTimer_OnInterrupt (UserDataPtr=0x0 ) at Sources/Events.c:80
80              switch (led_state++) {
1: led_state = 1
(gdb) next
87                      RedLED_ClrVal(RedLED_DeviceData);
1: led_state = 2
(gdb) next
88                      break;
1: led_state = 2
(gdb) continue
Continuing.

Breakpoint 2, LEDTimer_OnInterrupt (UserDataPtr=0x0 ) at Sources/Events.c:80
80              switch (led_state++) {
1: led_state = 2
(gdb) continue
Continuing.

Breakpoint 2, LEDTimer_OnInterrupt (UserDataPtr=0x0 ) at Sources/Events.c:80
80              switch (led_state++) {
1: led_state = 3
(gdb) clear
Deleted breakpoint 2 
(gdb) continue
Continuing.
^C
Program received signal SIGINT, Interrupt.
main () at Sources/ProcessorExpert.c:66
66        for(;;){}
1: led_state = 6
(gdb) quit
A debugging session is active.

        Inferior 1 [Remote target] will be detached.

Quit anyway? (y or n) y
Detaching from program: /tmp/frdm-kl25z-blink3-1.0/frdm_kl25z_blink3, Remote target
Ending remote debugging.

user@localhost /tmp/frdm-kl25z-blink3-1.0 $ 

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s