Guru Meditation Error: Core 0 panic'ed (Stack protection fault).
Detected in task "pthread" at 0x403801da
Stack bounds: 0x3fc97cb0 - 0x3fc982b0 (仅 2.6KB!)
根本原因:ESP-IDF默认pthread栈只有3KB,C++异常需要4-5KB!
在项目根目录运行:
idf.py menuconfig导航到:
Component config →
Pthread →
Default task stack size (PTHREAD_TASK_STACK_SIZE_DEFAULT)
将默认值从 3072 改为 8192 (8KB)
或者直接在 sdkconfig 中添加/修改:
CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=8192如果内存极度紧张,可以禁用异常:
idf.py menuconfig导航到:
Compiler options →
Enable C++ exceptions (COMPILER_CXX_EXCEPTIONS)
[✗] 取消勾选
或在 sdkconfig 中:
# CONFIG_COMPILER_CXX_EXCEPTIONS is not set# Pthread配置
CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=8192
# SignalR配置
CONFIG_SIGNALR_WORKER_STACK_SIZE=6144
CONFIG_SIGNALR_CALLBACK_STACK_SIZE=6144
CONFIG_SIGNALR_MAX_CALLBACK_TASKS=3# Pthread配置
CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=6144
# SignalR配置
CONFIG_SIGNALR_WORKER_STACK_SIZE=6144
CONFIG_SIGNALR_CALLBACK_STACK_SIZE=4096
CONFIG_SIGNALR_MAX_CALLBACK_TASKS=2# Pthread配置
CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=4096
# SignalR配置
CONFIG_SIGNALR_WORKER_STACK_SIZE=4096
CONFIG_SIGNALR_CALLBACK_STACK_SIZE=3072
CONFIG_SIGNALR_MAX_CALLBACK_TASKS=1| 配置 | Pthread | Worker | 回调 | 总计 | 稳定性 |
|---|---|---|---|---|---|
| 推荐 | 8KB | 6KB×2 | 6KB×3 | 38KB | ⭐⭐⭐⭐⭐ |
| 平衡 | 6KB | 6KB×2 | 4KB×2 | 26KB | ⭐⭐⭐⭐ |
| 极限 | 4KB | 4KB×2 | 3KB×1 | 15KB | ⭐⭐ |
| 当前(崩溃) | 3KB | 6KB×2 | 6KB×3 | 33KB | ❌ |
grep PTHREAD_TASK_STACK sdkconfig
grep SIGNALR_ sdkconfig在日志中搜索:
Worker task exiting - stack: XXX bytes used, YYY bytes free
Callback task final statistics: XXX bytes used, YYY bytes free
如果"bytes free"低于512,必须增加栈!
重新编译并测试:
idf.py build flash monitor观察日志:
- ✅ 不再出现"Stack protection fault"
- ✅ 栈使用统计显示有足够余量
- ✅ 网络断开重连不会崩溃
ESP-IDF的某些组件(如WebSocket客户端的事件处理)可能在pthread上下文中执行:
ESP WebSocket库内部事件
↓
调用用户回调(在pthread中)
↓
SignalR代码执行
↓
C++异常展开
↓
pthread栈溢出!💥
-
✅ 预创建9个静态异常对象
- 启动时创建一次
- 运行时零开销
-
✅ Worker栈增加到6KB
-
✅ 回调任务栈增加到6KB
-
✅ WebSocket任务栈增加到8KB
- ❌ pthread栈 - 需要在
menuconfig或sdkconfig中设置
# 1. 配置pthread栈
idf.py menuconfig
# 设置 Pthread → Default task stack size = 8192
# 2. 重新编译
idf.py build
# 3. 烧录测试
idf.py flash monitor- ✅ pthread栈从3KB → 8KB
- ✅ 完全消除栈溢出
- ✅ 稳定运行不崩溃
- ✅ 内存总开销:+5KB
更新日期: 2026-01-09
严重程度: CRITICAL
状态: