C 条件数据观察点不';不能在ARM GDB中工作

C 条件数据观察点不';不能在ARM GDB中工作,c,debugging,arm,gdb,cortex-m,C,Debugging,Arm,Gdb,Cortex M,我的目的是能够捕获全局变量何时具有某个精确值。GDB具有可根据其实现的功能 考虑以下为x86 Linux编写的简单程序: int-myVar=0; 无效调试监视点(){ 对于(int i=0;i

我的目的是能够捕获全局变量何时具有某个精确值。GDB具有可根据其实现的功能

考虑以下为x86 Linux编写的简单程序:

int-myVar=0;
无效调试监视点(){
对于(int i=0;i<2000;i++){
myVar++;
}
}
int main(){
调试监视点();
返回0;
}
使用

gcc-o main-ggdb3-Og main.c
并开始使用GDB进行调试:

max@PC-LT-23:~/stackoverflow$gdb./main
GNU gdb(Ubuntu 8.3-0ubuntu1)8.3
版权所有(C)2019免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。
有关详细信息,请键入“显示复制”和“显示保修”。
此GDB配置为“x86_64-linux-gnu”。
键入“显示配置”以获取配置详细信息。
有关错误报告说明,请参阅:
.
在线查找GDB手册和其他文档资源,网址为:
.
要获得帮助,请键入“帮助”。
键入“apropos word”以搜索与“word”相关的命令。。。
正在从/main读取符号。。。
(gdb)b干管
断点1位于0x1146:file main.c,第9行。
(gdb)启动
0x1146处的临时断点2:file main.c,第9行。
启动程序:/home/max/stackoverflow/main
断点1,main()位于main.c:9
9 int main(){
(gdb)如果myVar==1337,则监视myVar
硬件观察点3:myVar
(gdb)继续
持续的。
硬件观察点3:myVar
旧值=1336
新值=1337
调试main.c:4上的监视点()
4表示(int i=0;i<2000;i++){
(gdb)
正如您所见,它在变量设置为1337的时间点停止了程序

考虑使用
arm none eabi gcc
为STM32L476RG微控制器编译的完全相同的程序,该微控制器具有Cortex-M4F内核。此处使用的IDE是STM32的System Workbench(又称Eclipse),其项目由STM32CubeMX生成

现在启动
openocd

Open-On-Chip调试器0.10.0+dev-00021-g524e8c8(2019-04-12-08:33)
根据GNU GPL v2获得许可
有关错误报告,请阅读
http://openocd.org/doc/doxygen/bugs.html
srst_仅单独的srst_nogate srst_open_drain connect_assert_srst
信息:所选传输接管了低级目标控制。结果可能与普通JTAG/SWD不同
填充区域擦除设置为1
适配器速度:8000 kHz
适配器\u nsrst\u延迟:100
信息:侦听tcl连接的端口6666
信息:在端口4444上侦听telnet连接
信息:时钟速度8000千赫
信息:STLINK v2.1 JTAG v34 API v2 M25视频0x0483 PID 0x374B
信息:使用stlink api v2
信息:目标电压:0.011074
错误:目标电压可能太低,无法进行可靠调试
信息:无法匹配请求的速度8000 kHz,使用4000 kHz
信息:Stlink适配器速度设置为4000 kHz
信息:STM32L476RGTx.cpu:硬件有6个断点,4个观察点
信息:侦听端口3333上的gdb连接
信息:正在接受tcp/3333上的“gdb”连接
由于调试请求,目标已暂停,当前模式:线程
xPSR:0x01000000 pc:0x08001340 msp:0x20018000
main
函数中设置断点,然后像以前一样设置观察点。此外,在执行
debug\u watchpoints()
函数后设置断点

GNU gdb(适用于Arm嵌入式处理器的GNU工具9-2019-q4-major)8.3.0.20190709-git
版权所有(C)2019免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。
有关详细信息,请键入“显示复制”和“显示保修”。
此GDB配置为“-host=x86_64-linux-gnu--target=arm none-eabi”。
键入“显示配置”以获取配置详细信息。
有关错误报告说明,请参阅:
.
在线查找GDB手册和其他文档资源,网址为:
.
要获得帮助,请键入“帮助”。
键入“apropos word”搜索与“word”相关的命令。
(gdb)在../startup/startup_stm32l476xx.s:63处重置_处理程序()
63 ldr sp,=\u estack/*设置堆栈指针*/
临时断点3,main()位于../Src/main.c:65
65      {
(gdb)如果myVar==1337,则监视myVar
硬件观察点4:myVar
(gdb)信息断点
Num Type Disp Enb地址什么
2断点将y 0x08000f46保留在../Src/main.c:70处的main中
4 hw观察点保持y myVar
仅当myVar==1337时停止
(gdb)
当继续程序时,无论是否满足条件,它现在都会在每次修改带有
SIGTRAP
的变量时停止

程序接收信号信号陷阱、跟踪/断点陷阱。
0x08000ec2位于../Src/main.c:54处的调试监视点()中
54表示(int i=0;i<2000;i++){
(gdb)继续
持续的。
程序接收信号信号陷阱,跟踪/断点陷阱。
0x08000ec2位于../Src/main.c:54处的调试监视点()中
54表示(int i=0;i<2000;i++){
(gdb)继续
持续的。
程序接收信号信号陷阱,跟踪/断点陷阱。
0x08000ec2位于../Src/main.c:54处的调试监视点()中
54表示(int i=0;i<2000;i++){
(gdb)信息断点
Num Type Disp Enb地址什么
2断点将y 0x08000f46保留在../Src/main.c:70处的main中
4 hw观察点保持y myVar
仅当myVar==1337时停止
(gdb)打印myVar
$2 = 3
我可以继续任意次数,每次变量更改时,它都会中断

在我的“调试堆栈上的内存损坏”场景中,我真的需要GDB正确地评估条件,否则程序会停止一千次或更多次(每次恰好位于该内存位置的变量发生更改),而不仅仅是在写入特定值的特定时间
DWT->COMP2 = <address to compare>;
DWT->FUNCTION2 = 0;
DWT->COMP1 = <word to compare>;
DWT->FUNCTION1 = 0x20B06;