最新消息:20190717 VPS服务器:Vultr新加坡,WordPress主题:大前端D8,统一介绍入口:关于

调试器表象和实际执行不一样,导致看起来代码跑飞了

工作和技术 crifan 560浏览 0评论

调试器表象和实际执行不一样,导致看起来代码跑飞了

将要运行:
void handleUsb(void)
{
afeReadRegister(CTR_USB_REGISTER, &regVal, ctrlAfeReadDone);
……
……
}

对应汇编为:
handleUsb:
LDR r2, 0x143a4
MOVS r0,#0x25
MOV r1,sp
BL afeReadRegister <0x8c2>
注:宏CTR_USB_REGISTER值为0x25

但是执行起来,表象是死在了这行汇编上面,
LDR r2, 0x143a4
只要一单步执行这行,程序就跑飞了,就是继续运行状态了,中断运行后,发现已经处于systemIdle状态了。
很纳闷,觉得该行只是简单的到地址出取值送到寄存器而已,不太可能发生什么问题啊。

开始以为是0x143a4地址中的值0x00014261是奇数,
而cpu不能执行奇数所导致程序飞了,
但是发现其他很多函数都是奇数地址,但都能正常运行,
而且,此处只是取出该值,放到r2寄存器中,并未实际执行,
又加上后来手动将值该为0x00014260,程序也还是跑飞,
所以不是这个问题。

然后又尝试,在
其下面两行
MOVS r0,#0x25
MOV r1,sp
都打上断点,然后单步上面那行,也还是无法运行到
MOVS r0,#0x25

MOV r1,sp
一直很疑惑。

后来经过老大的解决,大概明白了,
也许是调试器有问题,使得不能单步执行吧,
但是实际上,该函数已经继续执行了,只不过是后来的执行到某处,
由于中断打扰,而跑到别的地方了。

继续在函数afeReadRegister中,后期要执行的函数打上断点,发现在哪里打断点,程序就可以运行到哪里。

总结:
1.即使对于严谨的调试器,可能有时候表现出来的情况,未必是完全真实的,根本的原因,只能慢慢排查。
2.对于中断打扰代码的执行,也要注意。

转载请注明:在路上 » 调试器表象和实际执行不一样,导致看起来代码跑飞了

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
53 queries in 0.087 seconds, using 18.80MB memory