AliOS Things 维测高阶能力之数据断点(DWT)使用

简介: ### 1.    数据断点DWT介绍 在ARM Cortex-M及A系列CPU中,有很多调试组件,使用它们可以执行各种调试功能,包括断点(breakpoint)、数据段点(Data WatchPoint 即 DWT)及各种跟踪(trace)等。 硬件调试模块允许内核在访问数据断点时停止。内核停止时,内核的内部状态和系统的外部状态都是可以查询的。完成查询后,内核和外设可以被复原,程序将

1.    数据断点DWT介绍

在ARM Cortex-M及A系列CPU中,有很多调试组件,使用它们可以执行各种调试功能,包括断点(breakpoint)、数据段点(Data WatchPoint 即 DWT)及各种跟踪(trace)等。


硬件调试模块允许内核在访问数据断点时停止。内核停止时,内核的内部状态和系统的外部状态都是可以查询的。完成查询后,内核和外设可以被复原,程序将继续执行。


数据断点在调试内存被非法改写的时候非常有用,以往我们遇到类似问题的时候,经常使用JLINk+GDB的这一黄金组合来watch住一个变量(或者一段内存),将这个变量设置成只读,或者不可访问的模式,当它被访问或者改写的时候,系统就会Halt停下,这时我们可以查看系统状态、内存值、BT命令查看调用者等等,帮助调试。


如:在gdb中可通过下面的几种方法来设置watchpoint:


(gdb) watch  
     在指定变量/内存地址(表达式)expr设置一个watchpoint。一但expr值有变化时,将停住程序。


(gdb) rwatch
     当expr被读时,停住程序。


(gdb) awatch
当expr被读或被写时,停住程序。


(gdb) info watchpoints
查看watchpoint

(gdb)d n
删除watchpoint, 同删除breakpoint一样


举例:
想监控0地址处其实的1K字节是否被访问,若有read或者write访问,则程序停下
awatch (char[1024])*0x0

想监控0x1001dd08处的一段结构体的内部数据是否被改写,若发生改写则程序停下,只读无影响
watch ((k_mm_list_t *)0x1001dd08)->mbinfo->free_ptr


上述调试方法是硬件板子上JTAG或SWD口引出来后支持的调试手段,在IOT设备中,硬件往往很小,这类调试口经常是没有引出来的,在这种环境下,AliOS Things支持了一种在线数据断点的功能,即提供API接口,可以在软件中增加watch点,达到硬件GDB的DWT功能。

2.    AliOS Things在线数据断点DWT的实现

2.1    AliOS Things下在线数据断点说明

使用限制:当前仅支持 ARMV7m的数据断点,即Cortex-M3/M4系列CPU
需要说明的是:
1.    ARM9(armv5)架构的CPU由于ARM没有将DWT相关的寄存器透出,所以无法使用软件在线数据断点的功能,只能通过仿真器使用硬件DWT。
2.    Cortex A系列DWT的使用介绍将在后续给出
3.    ARMV7m支持的DWT的个数为4个

给出2个API:

2.2    API 列表

API 说明
debug_watch_on(void *addr) 启动DWT,监控一个地址(4 字节的数据)
debug_watch_off() 关闭DWT

调用示例1:watch一个全局变量

int g_dwt_test = 0;

void debug_watch_on(&g_dwt_test);
...

调用示例2:栈溢出检测

检测原理:任务的栈底base 保存的是固定的magic,正常情况下任务的栈大小足够大,任务的运行过程中任务栈不会下探到栈底stack_base的位置,如果发生这种情况,magic值被改写,就发生了栈溢出的情况。
所以我们在在任务被调度之前watch on栈底的magic,在任务被调度出去的之后watch off
如:

/*任务的栈底base 保存的是固定的magic*/
void * watch_addr = g_next_task->stack_base;

debug_watch off();
debug_watch_on(watch_addr);

cpu_task_switch();
...    
   

2.3   watch命中后的使用

AliOS Things维测组件提供了强大的系统异常快照功能
(参考ATA:https://www.atatech.org/articles/134601
我们将系统快照功能对接到DWT数据断点上,即发生watch命中后,自动输出当前系统的寄存器、任务状态、内存状态、OS(mutex/sem/bufqueue)状态以及此时的栈回溯backtrace ,可以直接显示当前谁改写了变量,导致了watch点的发生,大大提高了bug定位效率。


总结:watch命令可以在代码中的任意使用,无需连接硬件,结合AliOS Things维测特性,对内存改写、栈溢出等Bug定位非常有效

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
物联网 Linux
【AliOS Things学习笔记】为你的AliOS Things应用增加自定义cli命令
怎么才能在RTOS系统中,通过 串口shell控制LED的开关。
3677 0
|
AliOS-Things 物联网 编译器
使用HaaS Studio开发AliOS Things C/C++应用
本文章将介绍使用HaaS Studio 进行AliOS-Things C/C++应用开发。
使用HaaS Studio开发AliOS Things C/C++应用
|
传感器 监控 算法
使用AliOS Things快速构建温度计应用 |《AliOS Things快速开发指南》
本文是基于AliOS Things 3.1快速构建温度计的应用场景。涉及AliOS Things组件开发,构建AliOS Things用户项目,AliOS Things HAL API使用,向AliOS Things中添加并使用组件。用到的硬件设备有半导体开发板、温度传感器、数码管显示器。
使用AliOS Things快速构建温度计应用 |《AliOS Things快速开发指南》
|
域名解析 移动开发 数据可视化
使用 AliOS Things 3.0 快速构建用户应用 BlinkAPP
AliOS Things 3.0版本于去年9月份在云栖大会正式发布,在新版本中带来了全新的应用开发框架,帮助用户快速构建自己的应用。使用户可以更专注于自身应用的开发。本文将已BlinkAPP为例,为大家演示如何快速使用应用开发框创建项目并完成应用代码编写。
972 0
使用 AliOS Things 3.0 快速构建用户应用 BlinkAPP
|
物联网 机器人 AliOS-Things
|
物联网 传感器 API
AliOS Things 3.0应用笔记:http client简单应用
AliOS Things 3.0版本新增加了httpc组件(http 客户端组件),httpc组件支持多种RESTful的API调用,包括GET、POST、PUT、HEAD等,也支持https安全协议。
12355 1
|
物联网 机器人 AliOS-Things
AliOS Things 3.0应用笔记:摄像头配网 + 钉钉群通知 + 天气显示
AliOS Things 3.0应用笔记:摄像头配网 + 钉钉群通知 + LCD天气显示
3404 0
|
物联网 C++
使用AliOS Things 3.0快速构建用户应用 BlinkAPP
AliOS Things 3.0版本于9月27日在云栖大会正式发布,在新版本中带来了全新的应用开发框架,帮助用户快速构建自己的应用。使用户可以更专注于自身应用的开发。本文将已BlinkAPP为例,为大家演示如何快速使用应用开发框创建项目并完成应用代码编写。
7001 0
|
物联网 AliOS-Things 开发工具
AliOS Things 完成第一个应用:Hello World
这样理解一下: VSCode编译代码后,调用ST-Link将程序烧写到单片机内部。 编译完成后,也会生成二进制文件,这样就可以通过各种方法下载了,比如批量生产时候用脱机下载器。
11418 0