请阅读【Trace32 ARM 专栏导读】
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,来使CPU内核跑起来并达到断点处:
Break.set t32_test
Go
我们也可以把上面两个命令结合起来:
Go t32_test
这样我们可以把程序一直运行到t32_test
函数的入口处。
当然,写地址效果是一样的:
Go 0x2001823C
命令 Var.go g_t32 /Write
便可以把程序运行到 g_t32
变量被改写的位置。
有时,当程序正好停在某一个函数内,例如下图的 t32_test
,我希望快速地执行完当前函数的所有代码,并返回到上一层调用者的位置:
我们可以使用命令 Go.up
, 执行完后,可以看到 PC 指针已经跳出 t32_test
。
上面介绍的Go
命令,不等同于 System.Mode Go
,也就是说不等同于如下窗口的Go
按钮
此处Go
按钮的完整作用是:
推荐阅读:
https://blog.csdn.net/weixin_48120109/article/details/126167861