请选择 进入手机版 | 继续访问电脑版

前馈科技

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3384|回复: 0

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

[复制链接]

97

主题

97

帖子

539

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
539
发表于 2021-10-25 17:18:50 | 显示全部楼层 |阅读模式
某日编写完成架构级看门狗的支持代码,并编写看门狗设备驱动,并尝试应用,发现只要执行sleep相关操作系统就会崩溃,由于从修改代码到测试间隔了几天,中间改动较多,已经无法返回!
1.png
观察寄存器发现,堆栈指针被异常改写为0x8421fc7,显然这应该是psr寄存器的值,不知何故,sp的值变成了psr的值:
2.png
函数返回恢复寄存器窗口,窗口下溢调用restore时需要根据堆栈指针恢复寄存器的值,而此时堆栈指针不对,导致读写异常!
3.png
排查的多时毫无进展!在操作系统中进行单步跟踪犹如大海捞针!最后甚至怀疑我的上下文切换存在问题,经过一番检查,发现上下文切换的汇编程序中确实存在不严谨的地方,主要在于写psr寄存器后需要三个nop,有些地方不满足。修改上下文切换汇编程序后,问题依旧,看来问题还不在这儿!
卡数天之后发现将板级支持包中启动喂狗的内核线程注释之后问题消除了,经分析,是看门狗内核线程堆栈溢出了!将喂狗内核线程由1024字节改为2048字节后问题得到解决。
4.png

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|计算机控制

GMT+8, 2024-3-28 16:40 , Processed in 0.069885 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表