【发布时间】:2016-01-28 19:18:32
【问题描述】:
我在 Linux 上使用带有 gdb 的 Segger J-Link Base 来调试 Atmel SAM4S8C MCU。我在启动 gdb 时使用 --command 参数指定的 gdb 命令文件中有以下内容:
target remote localhost:2331
monitor flash device SAM4S8C
我还在命令文件中指定了我的 ELF 文件和load 程序。
我注意到当我加载程序时(使用load),堆栈指针没有正确设置。 monitor reset 也不会修改堆栈指针。
J-Link User Guide 表示(对于 Cortex-M3 设备):
此外,用户必须手动更正堆栈指针 (R13) 和 PC (R15),重置后才能调试应用程序。
从 gdb 执行此操作的命令是什么?
很奇怪,我必须手动执行此操作。堆栈指针是复位向量的第一个条目。在我开发代码时,初始堆栈指针会发生变化(特别是在具有非常不同初始堆栈指针的应用程序之间切换,这是我第一次注意到这一点的方式)。
有没有办法让 gdb 在load 期间从 ELF 文件中读取并自动设置它?
【问题讨论】:
-
在上下文中,该声明似乎是专门关于调试基于 Cortex-M3 的 NXP LPC 设备的重置,并且似乎是关于绕过他们花哨的 ROM 引导加载程序。因此,它不一定直接适用于 Atmel 设备,尽管情况可能大体相似。
-
你可以通过
set $sp = <value>设置堆栈指针,但是GDB和flash加载的细节我都弄丢了,抱歉。我所有的努力都是使用商业工具在内部开发的 ROM 和引导加载程序。 -
@RussSchultz 谢谢,当我尝试直接设置它时,我错过了
=。请注意,在 Ada 模式下,堆栈指针是通过set $sp := <value>设置的。如果在 Ada 模式下使用set $sp = <value>,gdb 将生成以下消息:warning: Expression is not an assignment (and might have no effect)。