feedforward 发表于 2021-10-25 17:18:50

记一次堆栈溢出的调试过程

某日编写完成架构级看门狗的支持代码,并编写看门狗设备驱动,并尝试应用,发现只要执行sleep相关操作系统就会崩溃,由于从修改代码到测试间隔了几天,中间改动较多,已经无法返回!

观察寄存器发现,堆栈指针被异常改写为0x8421fc7,显然这应该是psr寄存器的值,不知何故,sp的值变成了psr的值:

函数返回恢复寄存器窗口,窗口下溢调用restore时需要根据堆栈指针恢复寄存器的值,而此时堆栈指针不对,导致读写异常!

排查的多时毫无进展!在操作系统中进行单步跟踪犹如大海捞针!最后甚至怀疑我的上下文切换存在问题,经过一番检查,发现上下文切换的汇编程序中确实存在不严谨的地方,主要在于写psr寄存器后需要三个nop,有些地方不满足。修改上下文切换汇编程序后,问题依旧,看来问题还不在这儿!
卡数天之后发现将板级支持包中启动喂狗的内核线程注释之后问题消除了,经分析,是看门狗内核线程堆栈溢出了!将喂狗内核线程由1024字节改为2048字节后问题得到解决。


页: [1]
查看完整版本: 记一次堆栈溢出的调试过程