【ARM Trace32(劳特巴赫) 使用介绍 14 -- Go.direct 介绍】

发布时间:2023年12月17日


请阅读【Trace32 ARM 专栏导读】


Trace32 Go.direct

TRACE32调试过程中,会经常对芯片/内核进行控制,比如全速运行、暂停、单步等等。这篇文章先介绍全速运行Go.direct
在这里插入图片描述
Go命令一般用于控制芯片/内核的全速、实时运行,命令不区分大小写,也可以缩写成一个字母g

这边文章以测试函数t32_test 为例进行介绍,其反 C 代码如下:

struct t32_str {
        uint32_t        t32_val;
        uint32_t        t32_id;
        char*           t32_name;
};

static volatile struct t32_str str_t32;
static uint32_t volatile g_t32;

void t32_test(void)
{
        uint32_t t32_tmp;

        hal_printf("%s\n", __func__);

        t32_tmp = 0xdeadbeef;

        g_t32 = 0xdeadbeef;

        str_t32.t32_val = 0x5a5a5a5a;
        str_t32.t32_id = 0xacce55;
        str_t32.t32_name = "trace32";

        hal_printf("t32_tmp:0x%x, g_t32:0x%x, val:0x%x, id:0x%x, name:%s\n",
                   t32_tmp, g_t32, str_t32.t32_val, str_t32.t32_id, str_t32.t32_name);
}

汇编代码如下:

38110 2001823c <t32_test>:
38111 2001823c:       b510            push    {r4, lr}
38112 2001823e:       b082            sub     sp, #8
38113 20018240:       490c            ldr     r1, [pc, #48]   ; (20018274 <t32_test+0x38>)
38114 20018242:       480d            ldr     r0, [pc, #52]   ; (20018278 <t32_test+0x3c>)
38115 20018244:       f7fa fa06       bl      20012654 <hal_printf>
38116 20018248:       480c            ldr     r0, [pc, #48]   ; (2001827c <t32_test+0x40>)
38117 2001824a:       490d            ldr     r1, [pc, #52]   ; (20018280 <t32_test+0x44>)
38118 2001824c:       6001            str     r1, [r0, #0]
38119 2001824e:       f04f 335a       mov.w   r3, #1515870810 ; 0x5a5a5a5a
38120 20018252:       6043            str     r3, [r0, #4]
38121 20018254:       4b0b            ldr     r3, [pc, #44]   ; (20018284 <t32_test+0x48>)
38122 20018256:       6083            str     r3, [r0, #8]
38123 20018258:       4b0b            ldr     r3, [pc, #44]   ; (20018288 <t32_test+0x4c>)
38124 2001825a:       60c3            str     r3, [r0, #12]
38125 2001825c:       6802            ldr     r2, [r0, #0]
38126 2001825e:       6843            ldr     r3, [r0, #4]
38127 20018260:       6884            ldr     r4, [r0, #8]
38128 20018262:       68c0            ldr     r0, [r0, #12]
38129 20018264:       9001            str     r0, [sp, #4]
38130 20018266:       9400            str     r4, [sp, #0]
38131 20018268:       4808            ldr     r0, [pc, #32]   ; (2001828c <t32_test+0x50>)
38132 2001826a:       f7fa f9f3       bl      20012654 <hal_printf>
38133 2001826e:       b002            add     sp, #8
38134 20018270:       bd10            pop     {r4, pc}
38135 20018272:       bf00            nop
38136 20018274:       2001e478        .word   0x2001e478
38137 20018278:       2001a5e8        .word   0x2001a5e8
38138 2001827c:       20021038        .word   0x20021038
38139 20018280:       deadbeef        .word   0xdeadbeef
38140 20018284:       00acce55        .word   0x00acce55
38141 20018288:       2001c8d8        .word   0x2001c8d8
38142 2001828c:       2001c8e0        .word   0x2001c8e0

Go配合程序断点使用

正常我们设置好断点后,都需要点击Go,来使CPU内核跑起来并达到断点处:

Break.set t32_test
Go

在这里插入图片描述

我们也可以把上面两个命令结合起来:

Go t32_test

这样我们可以把程序一直运行到t32_test函数的入口处。

当然,写地址效果是一样的:

Go 0x2001823C

Go 配合读写断点使用

命令 Var.go g_t32 /Write 便可以把程序运行到 g_t32 变量被改写的位置。
在这里插入图片描述

Go 快速回到上一层函数

有时,当程序正好停在某一个函数内,例如下图的 t32_test,我希望快速地执行完当前函数的所有代码,并返回到上一层调用者的位置:
在这里插入图片描述

我们可以使用命令 Go.up , 执行完后,可以看到 PC 指针已经跳出 t32_test
在这里插入图片描述

System.Mode Go

上面介绍的Go命令,不等同于 System.Mode Go ,也就是说不等同于如下窗口的Go按钮
在这里插入图片描述

此处Go按钮的完整作用是:

  • Step1:复位芯片(如果接有复位信号)
  • Step2:TRACE32尝试连上芯片内核并建立调试通信
  • Step3: 控制芯片内核全速运行

推荐阅读
https://blog.csdn.net/weixin_48120109/article/details/126167861

文章来源:https://blog.csdn.net/sinat_32960911/article/details/134965052
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。