gdb(通过 pyocd)显示过时的内存内容

问题描述 投票:0回答:1

我正在使用 SWD 探针在 MAX32660 中写入内存位置,同时运行以下程序。

  while (true)
    {
      DEBUG("x=%d", *(int volatile*)0x20017000);
      Tick_Delay_US(1000000);
    }

正在工作;程序显示探头写入的值:

92503131 main.c:81      x=125300000
93503118 main.c:81      x=125400000
94503104 main.c:81      x=125600000
95503090 main.c:81      x=125700000
96503077 main.c:81      x=125900000
97503063 main.c:81      x=126100000
98503050 main.c:81      x=126200000
99503036 main.c:81      x=126400000

不幸的是,GDB(通过 pyocd 服务器)似乎只能在每次程序停止后从内存中读取一次值:

(gdb) print *(int volatile*)0x20017000
$1 = 178700000
(gdb) print *(int volatile*)0x20017000
$2 = 178700000
(gdb) print *(int volatile*)0x20017000
$3 = 178700000
(gdb) print *(int volatile*)0x20017000
$4 = 178700000
(gdb) print *(int volatile*)0x20017000
$5 = 178700000
(gdb) print *(int volatile*)0x20017000
$6 = 178700000
(gdb) print *(int volatile*)0x20017000
$7 = 178700000
(gdb) cont
Continuing.
^C
Program received signal SIGINT, Interrupt.
0x000003aa in Tick_Reached (target=<optimized out>) at ../../max/Tick.h:60
60      {while (!Tick_Reached(target));}
(gdb) print *(int volatile*)0x20017000
$8 = 180800000
(gdb) print *(int volatile*)0x20017000
$9 = 180800000
(gdb) print *(int volatile*)0x20017000
$10 = 180800000
(gdb) print *(int volatile*)0x20017000
$11 = 180800000

我查看了探测日志,发现 GDB 仅在我第一次请求时才读取该值(通过 MEM-AP 的 TAR/DRW 寄存器)。

这是出乎意料的并且不是很有用。程序的运行与内存缓存有什么关系? (另外,即使它们相关,我也不明白这一点。我以为它可能是在程序停止时尝试对内存进行快照。但事实并非如此。它正在按需读取值......但只有在您第一次要求它)。

除了继续执行程序之外,还有什么办法可以强制GDB再次从内存中读取值吗?

arm gdb swd pyocd
1个回答
0
投票

我在

pyocd
中打开了 DEBUG 日志记录,并看到以下与 GDB 获取新值相关的消息:

DEBUG:Probe:WRITE TAR (AP0.04) <- 0xe000edf0
DEBUG:Probe:READ  DRW (AP0.0c), now=False, uid=rd75
DEBUG:Probe:  rd75 = 0x01010001
DEBUG:pyocd.cache.memory:core is running; invalidating cache
DEBUG:Probe:WRITE TAR (AP0.04) <- 0x20017000
DEBUG:Probe:READ  DRW (AP0.0c), now=True, uid=rd76
DEBUG:Probe:  rd76 = 0x049791b4
DEBUG:Probe:FLUSH

pyocd.cache.memory
似乎在说它正在使缓存失效因为核心正在运行。这当然是一个有缺陷的启发式。

我通过在

pyocd.cache.memory
中添加对
self._reset_cache()
的无条件调用来禁用
memory.MemoryCache._check_cache()
。现在 GDB 正在按预期工作:

(gdb) print *(int*)0x20017000
$1 = 207094350
(gdb) print *(int*)0x20017000
$2 = 207323100
(gdb) print *(int*)0x20017000
$3 = 207425550
(gdb) print *(int*)0x20017000
$4 = 207484200
(gdb) print *(int*)0x20017000
$5 = 207542850
(gdb) print *(int*)0x20017000
$6 = 207581550

我将提出一个关于关闭缓存的最佳方法的单独问题。

© www.soinside.com 2019 - 2024. All rights reserved.