gdb stubs研究直播贴

发布于 2013-03-28 02:27:14
相关资料:
ecos源码:

论文(来自于CNKI)
1). 基于gdb的嵌入式系统调试器的设计与实现 龚伟
其他资源(非教育网可获取)
2) 《ARM Cortex M3权威指南》 电子版(宋岩译)
3). http://ieee.uwaterloo.ca/coldfire/gcc-doc/docs/porting_4.html
4). http://davis.lbl.gov/Manuals/GDB/gdb_17.html
5). gdb官方手册。

2013年03月28日 02:10:51
--------------------------------------------------------------------------------------------
花了两个小时分析了下ecos里stm32的gdb stubs的源码,很有意思。gdb stubs相关源码分布在 ecospackageshalcommoncurrentsrc 与 ecospackageshalcortexmarchcurrentsrc 目录下。说实话,感觉ecos的代码比RTT的复杂多了啊。无论是源码组织还是代码实现。RTT显得很简洁。

首先分析ecospackageshalcortexmarchcurrentsrc 目录下的源码文件
首先应阅读 vector.c,读此文件可以搞清楚eCos里的中断/异常向量有哪些。
另外需注意,此文件实现很独特,在这个文件中只安装了两个vector。其他vector是在hal_reset_vsr(hal_misc.c)函数中安装的的。
gdb相关需要重点关注 hal_default_exception_vsr,它会调用 hal_deliver_exception函数(hal_misc.c)分发异常。
void hal_deliver_exception( HAL_SavedRegisters *regs )
需要仔细阅读hal_default_exception_vsr汇编实现,还没有分析如何构造的hal_deliver_exception的参数。

hal_deliver_exception--> __handle_exception (ecospackageshalcortexmarchcurrentsrcgeneric-stub.c)
待分析。

2013年04月08日 11:49:09
--------------------------------------------------------------------
昨天想到一个问题:如何设定gdb 使用串口(RS232/UART)呢?
答案是: gdb启动后,可以通过命令指定设备名字与端口
target remote 后面可以直接跟一个设备。

target remote /dev/ttyS1
参见参考文献5,其中附录E给出了gdb Remote Serial Protocol的详细介绍。
不过在windows下的CMD窗口里运行gdb,这个设备名该怎么写,资料上都没说
所以首先还是现在linux下或者cygwin中调试

avr的gdb stubs参考实现,见附件 avr-stub.c,点击下载下载附件[avr-stub.7z]

2013年04月08日 22:45:15
--------------------------------------------------------------------------------
设计实验:将STM32的两个串口连接到PC上,一个串口用来与GDB通信,并将从GDB上接收到的数据转发到第二个串口,这样我们就可以知道GDB到底向单片机发送了什么数据。
所以stm32里写入一个程序,实现串口数据转发即可。

在window上,打开CMD命令行,执行arm-none-eabi-gdb,即进入gdb命令行模式
D:Program FilesMicrosoft Visual Studio 8VC>arm-none-eabi-gdb
GNU gdb (Sourcery G++ Lite 2011.03-42) 7.2.50.20100908-cvs
Copyright (C) 2010 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=i686-mingw32 --target=arm-none-eabi".
For bug reporting instructions, please see:
.

首先需要设置串口波特率
(gdb) set remotebaud 115200

接下来指定GDB连接串口,从设备管理器查到,STM32的两个串口分别为COM3和COM35,注意GDB中不能识别COM35,似乎是GDB中识别的串口设备有限,因此指定COM3与GDB通信,COM35用于转发从GDB收到的命令。打开串口调试软件(secureCRT/putty/超级终端等),
我们使用target remote命令连接串口,
target remote 设备
注意,windows中,设备名需要使用COMx,其中x是具体的串口数字。linux中则需要使用 /dev/ttyS0。

键入命令并按下回车后,注意观察连接COM35的串口软件上的打印数据
(gdb) target remote COM3

果然,键入回车后,COM35上打印了如下数据
+$qSupported:qRelocInsn+#9a$qSupported:qRelocInsn+#9a$qSupported:qRelocInsn+#9a$qSupported:qRelocInsn+#9a---+$Hg0#df$Hg0#df$Hg0#df$Hg0#df-

gdb串口上打印:
Ignoring packet error, continuing...
warning: unrecognized item "timeout" in "qSupported" response

显然由于我们的板子上没有对接收到的gdb协议包做任何处理,所以gdb无法收到任何响应,因此一段时间后,爆错。

查看更多

关注者
0
被浏览
7.7k
15 个回答
bernard
bernard 2013-03-28
记得gdb stub是动态替换断点处的指令,然后当执行到这个地方时陷入到异常向量去,然后gdb stub捕获

所以可以分成两部分:
1. gdb stub协议的处理,以及上下文保存
2. 异常向量处理
prife
prife 2013-03-28
占位
另,gdb stubs的资料相对较少。大部分都是用在linux上,少有RTOS的。说实话,我还没有对gdb stubs的流程有一个特别清晰的认识,只有一个大概的轮廓。
grissiom
grissiom 2013-03-28
如果是动态替换的话,在 ROM 上会不会比较麻烦?想 MDK/Ecllipse 的断点调试是怎么实现的?
aozima
aozima 2013-03-28
拒绝白嫖,拒绝键盘侠!
如果是动态替换的话,在 ROM 上会不会比较麻烦?想 MDK/Ecllipse 的断点调试是怎么实现的?

应该是内核直接支持断点的,并不一定需要修改ROM上面的内容,当硬件断点都用完了,且目标是FLASH的话,需要在线烧写(超慢)。
northcamel
northcamel 2013-04-04
顶!努力补习基础知识中。
visitor83
visitor83 2013-05-14
在packages/hal/cortexm/arch/current/src/hal_misc.c中hal_reset_vsr(void)-->

#if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS)
// Enable DebugMonitor exceptions. This is needed to enable single
// step. This only has an effect if no exteranl JTAG device is attach
{
CYG_ADDRESS base = CYGARC_REG_DEBUG_BASE;
cyg_uint32 demcr;
HAL_READ_UINT32(base + CYGARC_REG_DEBUG_DEMCR, demcr);
demcr |= CYGARC_REG_DEBUG_DEMCR_MON_EN;
HAL_WRITE_UINT32(base + CYGARC_REG_DEBUG_DEMCR, demcr);
}

看代码里_DEMCR这个宏是另一套stub实现,具体在看。

initialize_stub() : package/hal/common/current/src/generic-stub.c 初始化
1) install the standard set of trap handlers for the stub
在pakcages/hal/cortexm/stm32/var/current/include/plf_stub.h中指定
HAL_STUB_PLATFROM_INTERRUPTIBLE = 0不允许中断发生,其他中断与非stub使能状态一样。

2) 安装stub的设备例如串口 packages/hal/cortexm/stm32/var/current/src/hal_diag.c-->cyg_hal_plf_comms_int(void),然后发出去个'+' 回应。

粗略读了下ecos代码,下来在读hal_deliver_exception
visitor83
visitor83 2013-05-14
确实在vector.S中hal_default_exception_vsr 有去call hal_deliver_exception, 初始化将2~15中断向量都指向了hal_default_exception_vsr, 压入R1=exception state type, R2= vector number, R3=basepri, hal_default_exception_vsr参数为数据寄存器r0~r10, r11~r15, cpsr, vector, svc_lr, svc_sp,应该跟压入的参数顺序一致

_hal_registers = regs // _hal_registers 在packages/hal/common/current/src/hal_stub.c中定义 ,接下来执行__handle_exception(void)中要处理真正的stub
prife
prife 2013-10-15
把这个帖子顶上来。最近要加快速度做这个事情了。
bernard
bernard 2013-10-15
把这个帖子顶上来。最近要加快速度做这个事情了。


建议做好后再来更新,再顶帖都没人相信了 [s:155]
bernard
bernard 2013-10-15
把这个帖子顶上来。最近要加快速度做这个事情了。


建议做好后再来更新,再顶帖都没人相信了 [s:155]

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览