上一篇中,讲到了使用GDB连接redboot(作为GDB Server)来调试eCos应用程序。这个方法是把要调试的程序下载到RAM中进行调试,当然也可以下到flash中展开调试。

可扮演GDB Server角色的软件有很多,除了redboot外,我们常用的J-Link也具有GDB Server功能。所以,本文主要介绍使用GDB连接J-Link GDB Server来调试eCos应用程序。

调试原理

上一篇介绍的调试方法是通过连接redboot进行调试,其原理如图1所示。为描述方便,称之为调试方法1。

图1:eCos调试方法1的调试原理示意图

本文介绍的调试方法是通过连接J-Link GDB Server进行调试,其原理如图2所示。为描述方便,称之为调试方法2。

图2:eCos调试方法2的调试原理示意图

从图1和图2可以看出,调试方法1与方法2的区别在于以下几点:

  1. GDB Server运行位置不同。在方法1中,GDB Server由redboot的gdb stub担任,即GDB Server运行在设备端。而在方法2中,GDB Server由J-Link GDB Server担任,即GDB Server运行在宿主机也就是我们的PC中。
  2. GDB与GDB Server连接方式稍微有点区别。在方法1中,GDB与GDB Server连接可通过串口或者网络的方式进行连接。而在方法2中,它们之间的连接仅通过本地的网络连接方式。
  3. 在方法2中,宿主机与设备之间多了个硬件仿真器,它们之间的连接接口为USB—JTAG。

调试准备

调试前准备好以ROM方式启动的eCos应用程序。关于这面工作,请参考我写的关于stm32移植ecos 相关文章。

.gdbinit脚本

在J-Link的安装目录下,有一个名为“.gdbinit”的脚本文件。内容如下:

# connect to the J-Link gdb server
target remote localhost:2331

# Enable flash download and flash breakpoints.
# Flash download and flash breakpoints are features of
# the J-Link software which require separate licenses 
# from SEGGER.

# Select flash device
monitor flash device = STM32F103ZE

# Enable FlashDL and FlashBPs
monitor flash download = 1
monitor flash breakpoints = 1

# Clear all pendig breakpoints
monitor clrbp

# Set gdb server to little endian
monitor endian little

# Set JTAG speed to 5 kHz
monitor speed 5

# Reset the target
monitor reset
monitor sleep 1000

# Set JTAG speed in khz
monitor speed auto

# Vector table placed in Flash
monitor writeu32 0xE000ED08 = 0x00000000

实际上,这是一个GDB初始脚本文件范例。GDB初始脚本文件是一个GDB启动时载入的gdb命令集序列,默认文件名为:.gdbinit。有两种方式来启用这个脚本:

  1. 启动gdb时候。gdb在启动的时候,会在当前目录下查找”.gdbinit”这个文件,并把它的内容作为gdb命令进行解释。
  2. gdb运行期间。可以使用 source script_filename 来解释gdb命令脚本文件:script_filename。

假设要调试的程序的路径为:/cygdrive/e/workspace/proj_ecos/src/test_stm32/Debug。所以在调试前,先把J-Link的安装目录下的“.gdbinit”的脚本文件文件拷贝到该目录下。

启动J-Link GDB Server

J-Link有两个GDB Server,一个是J-Link GDB Server via JTAG,另一个是J-Link GDB Server via SWD。启动哪一个都可以,在这里不作区分。

image

图3:J-Link软件集

启动后,如下图所示:

image

图4:J-Link GDB Server界面

运行GDB,开始调试

在cygwin中运行gdb命令连接J-Link GDB Server,如下所示的操作记录(红色文字为命令操作):

Administrator@MICROSOF-6F30AF /cygdrive/e/workspace/proj_ecos/src/test_stm32/Debug
$ arm-eabi-gdb test_stm32.elf
GNU gdb (eCos GNU Tools 4.6.3-20120623) 7.4.1
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
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=i686-pc-cygwin –target=arm-eabi”.
For bug reporting instructions, please see:
<http://bugs.ecos.sourceware.org/>…
Reading symbols from /cygdrive/e/workspace/proj_ecos/src/test_stm32/Debug/test_stm32.elf…done.
0x00000000 in ?? ()
Select flash device: STM32F103ZE
Flash download enabled
Flash breakpoints enabled
Target endianess set to “little endian”
JTAG speed set to 5 kHz
Resetting target
Sleep 1000ms
Select auto target interface speed (4000 kHz)
Writing 0x00000000 @ address 0xE000ED08
(gdb) load
Loading section .rom_vectors, size 0x8 lma 0x8000000
Loading section .ARM.exidx, size 0x8 lma 0x8000008
Loading section .text, size 0x13980 lma 0x8000010
Loading section .rodata, size 0x920 lma 0x8013990
Loading section .sram, size 0xc10 lma 0x80142b8
Loading section .data, size 0x1380 lma 0x8014ec8
Start address 0x8000011, load size 90688
Transfer rate: 5904 KB/sec, 9068 bytes/write.
(gdb) b cyg_user_start
Breakpoint 1 at 0x80000d2: file ../service/main/main.c, line 50.
(gdb) c
Continuing.

Breakpoint 1, cyg_user_start () at ../service/main/main.c:50
50              TRACE_INFO(“..test hello…\n”);
(gdb) next
54              TRACE_DEBUG(“12345656777DFAFD\n”);
(gdb)
58                      APP_MSLEEP(100);
(gdb)

其中,

$ arm-eabi-gdb test_stm32.elf:执行GDB命令($ ,表示cygwin命令提示符),连接J-Link GDB Server。需要注意的是,GDB启动化,自动载入当前路径下的“.gdbinit”的脚本文件,执行一些命令。成功连接后,图4中的红色区域会变成绿色。

后面的操作都是GDB的一些常规操作,这里就不再一一说明了。

注意事项

本文以ROM启动的调试程序进行说明(也就是在flash调试)。如果使用这种方法进行RAM中程序调试,可能会遇到点麻烦。我认为,GDB启动时,因为会对目标进行复位操作,所以在下载程序到RAM之前,应当对RAM进行相关初始化,只有这样,才能正确进行RAM中程序调试。

另外,通过J-Link来调试eCos应用程序,它是不支持多线程调试的。如果要实现多线程调试,请参考这篇文章:为仿真器添加eCos多线程调试支持,GDBServer Extender使用说明

退出调试时,需要先退出GDB,再退出J-Link GDB Server。否则GDB很难退出。

» 文章出处: reille博客—http://velep.com , 如果没有特别声明,文章均为reille博客原创作品
» 郑重声明: 原创作品未经允许不得转载,如需转载请联系reille#qq.com(#换成@)
分享到:

 Leave a Reply

(必须)

(我会替您保密的)(必须)

*

   
© 2012 velep.com | reille blog | 管理| 粤ICP备12094833号-2| 谷歌地图| 百度地图| Suffusion theme|Sayontan Sinha

无觅相关文章插件,快速提升流量