ARM GDB在Linux上无法访问内存

3

尝试将开发环境切换到Linux,但遇到了一个(可能是新手)问题。在我的Mac上,我可以使用ARM GDB(来自GNU ARM嵌入式工具链的arm-eabi-none-gdb)将我的elf文件加载到我的STM32L432上,然后在我的断点处,简单的“i lo”(或者检查等)就可以给我本地变量。然而,在Linux上,完全相同的代码会给我类似以下的东西:

cr1 = <error reading variable cr1 (Cannot access memory at address 0x2000fff4)>

有没有什么我应该做的不同来正确地映射内存?

编辑:今天我想重新开始,使用整个SRAM块(数据手册RM0394第63页)的内存转储,看看是否存在某些偏移量(也许是我不知道的某种内存别名),但即使是dump命令也被阻止了:

(gdb) dump ihex memory result.bin 0x20000000 0x40000000
Cannot access memory at address 0x2000c000

这个问题在我的 Mac 上没有发生,我可以在示波器上看到我正在寻找的数据(没有什么比使用示波器调试软件更好的了),因此问题不在 SRAM 上,而是在 gdb 上。

对于投票关闭的人,你能具体说明这个问题为什么不相关吗?我正在使用 gdb 调试代码,并且几乎每个我提到的内容都有标签,这让我相信这是一个适当的提问地点。我不是在请求“调试帮助”,例如“帮助调试特定代码”,而是在请求帮助使用一种非常广泛使用的调试器来调试某些常见设备。


哎呀...在ARM上使用GDB有时候真是一种痛苦的经历。每次我不得不为ARM使用它时,我都会感到非常不舒服。确保你的发行版完全更新,包括执行apt-get update && apt-get dist-upgrade命令。 - jww
我曾经遇到过类似的问题,看起来可能是 https://sourceware.org/bugzilla/show_bug.cgi?id=23127 ,在 gdb 8.1.1 中已经修复。从源代码构建 gdb 8.3 对我有用。 - cxw
2个回答

2

如果将来有人遇到这个问题(比如我自己),那么问题在于gdb没有跟踪包括我的SRAM(即0x2000c000至0x40000000)的内存区域。解决方法是手动设置内存区域。

之前:

(gdb) info mem
Using memory regions provided by the target.
Num Enb Low Addr   High Addr  Attrs 
0   y   0x00000000 0x00040000 ro nocache 
1   y   0x08000000 0x08040000 flash blocksize 0x800 nocache 
2   y   0x1fff0000 0x1fff7000 ro nocache 
3   y   0x1ffff800 0x1ffff810 ro nocache 
4   y   0x20000000 0x2000c000 rw nocache 
5   y   0x40000000 0x5fffffff rw nocache 
6   y   0xe0000000 0xffffffff rw nocache

之后:

(gdb) mem 0x2000c000 0x40000000 32 rw
(gdb) info mem
Using user-defined memory regions.
Num Enb Low Addr   High Addr  Attrs 
0   y   0x00000000 0x00040000 ro nocache 
1   y   0x08000000 0x08040000 flash blocksize 0x800 nocache 
2   y   0x1fff0000 0x1fff7000 ro nocache 
3   y   0x1ffff800 0x1ffff810 ro nocache 
4   y   0x20000000 0x2000c000 rw nocache 
1   y   0x2000c000 0x40000000 rw 32 nocache 
5   y   0x40000000 0x5fffffff rw nocache 
6   y   0xe0000000 0xffffffff rw nocache

(gdb) x/x cr1
0x36c:  0x60f8af00

我想知道这是否意味着Linux的gdb与远程通信出现了问题。如果你在Linux上使用相对较新的gdb,那么最好查看远程协议日志,以确定出了什么问题;也就是说,如果你的Mac gdb可以自动工作的话。 - Tom Tromey
我有时间就会看一下。请记住,这是GNU ARM嵌入式工具链版本的gdb,可以在此处找到:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads。而且这是一个相当新的版本(只有一个月左右),所以可能只是他们的构建选项出了问题。我只是惊讶地发现在其他地方没有看到过这个问题。 - TrivialCase

0
当我使用 st-util 1.3.0作为GDB服务器在STM32L432上进行调试时,遇到了相同的问题。看起来这是该版本中存在的问题,在st-util 1.5.0中已经修复。目前只有那个版本的源代码,所以如果你碰巧处于这种情况,请尝试从代码构建1.5.0并尝试它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接