【问题标题】:Why do I get the Debug exception reason: Stack canary watchpoint triggered (main)?为什么我得到调试异常原因:堆栈金丝雀观察点已触发(主要)?
【发布时间】:2019-06-26 19:00:28
【问题描述】:

我正在使用esp-idf-v3.0esp32-wroom-32 编写程序。
我正在尝试添加日志,这些日志将保存在 fatfs 中。
经过一些日志后,我得到:

21:54:21.306 -> Debug exception reason: Stack canary watchpoint triggered (main) 
21:54:21.306 -> Register dump:
21:54:21.306 -> PC      : 0x40089827  PS      : 0x00060b36  A0      : 0x40082179  A1      : 0x3ffd3860  
21:54:21.340 -> A2      : 0x3ff40000  A3      : 0x00000033  A4      : 0x00000033  A5      : 0x00000000  
21:54:21.340 -> A6      : 0x00000024  A7      : 0xff000000  A8      : 0xe37fc000  A9      : 0x0000007e  
21:54:21.340 -> A10     : 0x00000000  A11     : 0xffffffff  A12     : 0x00000004  A13     : 0x00000001  
21:54:21.340 -> A14     : 0x00000005  A15     : 0x00000000  SAR     : 0x00000004  EXCCAUSE: 0x00000001  
21:54:21.340 -> EXCVADDR: 0x00000000  LBEG    : 0x400014fd  LEND    : 0x4000150d  LCOUNT  : 0xfffffff6  

为什么会发生在 main 上?

【问题讨论】:

    标签: esp32 esp-idf


    【解决方案1】:

    FreeRTOS 任务堆栈深度

    这很可能是由您的 FreeRTOS 任务中的堆栈溢出引起的。

    增加堆栈深度

    我要做的第一件事是为您的 FreeRTOS 任务增加堆栈深度。例如,如果您使用 configMINIMAL_STACK_SIZE 的堆栈大小创建任务,这可能低至 768 字节 - 这不足以满足许多常见要求。

    堆栈深度增加多少?

    回答这个问题并不容易,但是 - 在这种情况下 - 简单地增加它可能就足够了,直到您不再有堆栈溢出。如果您担心不会不必要地浪费内存,FreeRTOS includes a mechanism 让您知道任务已接近溢出其堆栈。

    缓冲区和金丝雀

    canary 只是缓冲区末尾的一个标记 - 会定期检查。如果它从其默认值更改,则意味着程序试图写入超出缓冲区的末尾 - 即存在缓冲区溢出

    通过更改配置中的两个选项(在Component Config -> FreeRTOS 部分下)在 ESP IDF 中启用使用金丝雀检测堆栈溢出:

    • '检查堆栈溢出' -> '使用金丝雀字节'
    • '将调试观察点设置为堆栈溢出检查' -> 启用

    如果您禁用第二个选项,则会收到 Guru Meditation 错误 - LoadProhibited 异常 - 在堆栈溢出的情况下。

    xTaskCreate() 和堆栈深度

    请记住,ESP IDF 中的 xTaskCreate() 版本与原始 FreeRTOS 中的版本不同。在原始 FreeRTOS 中,堆栈深度为 specified in words。在 ESP IDF 中,它是 specified in bytes。一个非常重要的区别!

    【讨论】:

    • 非常感谢,我尝试更改我的任务堆栈大小并且它有效!
    猜你喜欢
    • 2021-08-06
    • 2021-12-04
    • 1970-01-01
    • 2016-11-18
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多