ESP32系列:Unhandled debug exception 、Doubled exception错误

项目场景:

一个连接阿里云服务器的项目需要用到hmac-sha1算法计算阿里云签名密码,于是从GitHub移植了一个纯C的hmac-sha1 的库。(虽然说是esp-idf有自带的库,但还是没找到可用的)


问题描述

hmac-sha1库移植后在4.4版本的IDF里能正常跑,使用5.0版本的IDF跑后发生崩溃重启,其中hmac-sha1库作为代码组件被调用时的崩溃信息为Doubled exception,重启信息为RTC_SW_SYS_RST;当我把它从组件抽出来在主函数直接调用时的崩溃信息为Unhandled debug exception,重启信息为SW_CPU_RESET。当然,在多次测试过程中也有不发生崩溃而直接重启的现象,重启信息为TG1WDT_SYS_RESET;官方对此重启的解释为中断看门狗复位,一般来说是长时间关中断或者 ISR 函数中存在阻塞或者没有清中断 会造成中断看门狗复位,而我在代码中仅调用hmac-sha1计算函数,未使用其它任何外设功能。

 

 

 


原因分析:

因为之前在4.4版本的IDF能正常跑过,所以一开始未怀疑是该函数库的问题,以为是下载的IDF的版本存在缺陷,所以首先选择了将IDF更新到最新的稳定版本,但是错误仍然存在。后来在hmac-sha1函数里增加打印函数,发现函数能正常跑完,系统崩溃发生在子函数将要返回之时。顺着这个思路,不在使用子函数,而是将整个hmac-sha1计算函数放到main函数中,崩溃与重启都没有再发生。

基于此现象,开始怀疑是子函数栈空间不够大造成空间溢出导致子函数无法正常返回造成的,为了验证这个猜测,将hmac-sha1函数的实现放入freeRTOS任务中来实现。经测试发现,当任务的空间大小给定为1024、2048时崩溃均会出现,当空间大小给到4096时该bug消失,所以初步断定确实是由空间溢出造成的子函数返回错误。


解决方案:

该bug的解决方案:

1.通过创建任务的形式实现整个hmac-sha1函数,计算完成后可删除此任务。

2.将hmac-sha1子函数中占用空间较大的数组通过malloc申请至堆空间,函数执行完毕后释放该空间。

因为不想一个只使用一次的函数还要创个任务来实现,同时为了日后代码更好移植,所以这里选择了方案二将一个1k作用大小的数组用malloc申请就解决了。

这里还是需要吐槽一下,为什么会出现一个感觉总空间大小占用不超过3k的子函数无法正常返回系统就崩溃的bug啊,这完全不符合常理啊,3k很大吗?????另外,据说menuconfig里有能设置子函数栈空间大小的地方,我一样也没找到!!!!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于 Kingbase 数据库运行中报错 "unhandled event loop exception java heap space",这通常是由于 Java 堆空间不足引起的。Java 堆是 Java 虚拟机(JVM)用来存储对象实例的内存区域,当堆空间不足时,就会抛出该错误。 要解决这个问题,你可以尝试以下几种方法: 1. 增加 JVM 堆空间:通过调整 JVM 的启动参数来增加堆空间。具体而言,你可以使用 `-Xms` 和 `-Xmx` 参数来分别设置 JVM 的初始堆大小和最大堆大小。例如,可以使用 `-Xms512m -Xmx1024m` 来将初始堆大小设置为 512MB,最大堆大小设置为 1024MB。根据你的实际情况,可以适当调整这些值。 2. 优化数据库查询:检查数据库查询语句是否存在性能问题,例如是否存在大量的全表扫描或者没有正确使用索引。优化查询可以减少内存消耗,降低堆空间的压力。 3. 减少数据量:如果你的数据库中存储了大量数据,考虑清理或归档一些不再需要的数据,以减少内存消耗。 4. 检查代码中的资源泄漏:确保在代码中正确地释放数据库连接、释放查询结果集和关闭文件流等资源,避免资源泄漏导致内存占用不断增加。 5. 升级数据库或使用最新的驱动程序:检查是否存在已知的数据库版本或驱动程序问题,尝试升级数据库或使用最新版本的驱动程序来修复可能的 Bug。 如果上述方法无法解决问题,建议你查阅 Kingbase 数据库的官方文档或联系 Kingbase 的技术支持团队以获取更多帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值