【问题标题】:How do I set the stack pointer from gdb using JLink and a Cortex M4?如何使用 JLink 和 Cortex M4 从 gdb 设置堆栈指针?
【发布时间】: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)

标签: gdb arm embedded


【解决方案1】:

我遇到了这个问题,因为我的产品使用了位于闪存开头的引导加载程序,我想在调试时跳过它。由于堆栈指针值应存储为可执行文件中的第一个字,而复位向量应存储为下一个字,因此您需要以下内容:

$sp = {int} program_start_address
$pc = {int} program_start_address + 4

例如对于从 0x08001000 开始的二进制文件

$sp = {int} 0x08001000
$pc = {int} 0x08001004

【讨论】:

    【解决方案2】:

    Cortex-M 的设计使得不需要汇编启动代码:
    在启动时,Cortex-M 会自动从 flash 的前两个 32 位字加载 sp 和 pc 寄存器。
    对于我的 LPC1788,这意味着我需要加载 r13/sp 的内容为 0x00000000,以及 r15/pc 的内容为 0x00000004

    target remote localhost:2331
    monitor interface SWD
    monitor endian little
    monitor speed auto
    monitor reset
    monitor halt
    monitor flash device = LPC1788
    monitor flash download = 1
    monitor flash breakpoints = 1
    file program.elf
    load program.elf
    break main
    monitor reg r13 = (0x00000000)
    monitor reg r15 = (0x00000004) 
    continue
    

    【讨论】:

    • monitor reg 命令有效(谢谢!),但是我将r13 替换为spr15 替换为pc,地址为0x004000000x00400004 , 分别。如果我把它放在我的启动文件中,它只在启动 gdb 时有效——它不适用于 gdb 控制台内的后续loads。有没有办法在每次load 时设置寄存器?
    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2011-04-21
    • 2021-09-17
    相关资源
    最近更新 更多