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
相关文章
|
传感器 消息中间件 物联网
HCIA物联网初级考试-第五章物联网操作系统及感知层开发介绍
HCIA物联网初级考试-第五章物联网操作系统及感知层开发介绍
HCIA物联网初级考试-第五章物联网操作系统及感知层开发介绍
|
算法 AliOS-Things 物联网
HaaS100开发调试系列 之 定位AliOS Things内存及Crash问题
本文主要说开发调试过程中经常遇到的内存问题。
347 15
HaaS100开发调试系列 之 定位AliOS Things内存及Crash问题
|
AliOS-Things 物联网 编译器
使用HaaS Studio开发AliOS Things C/C++应用
本文章将介绍使用HaaS Studio 进行AliOS-Things C/C++应用开发。
使用HaaS Studio开发AliOS Things C/C++应用
|
NoSQL 物联网
使用线上的开发板做开发调试 |《AliOS Things快速开发指南》
当您手上没有现成可用的开发板时,也可以使用线上的开发板来调试验证您的程序。本文主要介绍线上开发板的使用流程。
使用线上的开发板做开发调试 |《AliOS Things快速开发指南》
|
监控 AliOS-Things 物联网
使用线下开发板进行开发调试 |《AliOS Things快速开发指南》
本文主要介绍如何使用VSCode进行项目编译、固件烧录及串口监控。
使用线下开发板进行开发调试 |《AliOS Things快速开发指南》
|
域名解析 JSON AliOS-Things
AliOS Things 开发:让你的开发板支持 AliOS Studio 烧录
本文主要为大家讲解如何进行 AliOS Studio 烧录。
1116 0
AliOS Things 开发:让你的开发板支持 AliOS Studio 烧录
|
物联网 NoSQL Windows
AliOS Things开发:让你的开发板支持AliOS Studio调试
在AliOS-Things 2.1版本之后,AliOS Studio提供了一套简单易懂的接口可以让开发者很容易适配开发板支持调试功能。
AliOS Things开发:让你的开发板支持AliOS Studio调试
|
NoSQL 物联网 AliOS-Things
AliOS Things开发:让你的开发板支持AliOS Studio调试
简介 在AliOS-Things 2.1版本之后,AliOS Studio提供了一套简单易懂的接口可以让开发者很容易适配开发板支持调试功能。可以支持大部分的调试接口,比如ST-Link、JLink、CMSIS-DAP等。
3389 0
|
传感器 自然语言处理 监控
快速开发一个带APP的红外体温枪(基于AliOS Things Inside的Wi-Fi模组)
非接触红外测温在医疗,环境监测、个人健康等领域得到越来越广泛的应用。本文将向大家介绍如何通过AliOS-Things inside的WiFi模组,快速完成体温检测,流程涵盖从传感器数据采集,到阿里云IoT智能生活平台接入,以及快速构建App完成监控。
|
物联网 AliOS-Things 数据格式
AliOS Things开发:让你的开发板支持AliOS Studio烧录
本文简单介绍一下如何让aos upload指令支持你的开发板下载,从而在AliOS-Studio中点击upload按钮即可立即下载AliOS-Things编译好的binary
13882 0