ESP32用JTAG ESP-PROG调试ESP Async WebServer时反复触发SIGTRAP
我用VS Code搭配PlatformIO,基于ESP Async WebServer开发伪REST服务器,串口上传测试能正常运行,但使用JTAG ESP-PROG调试时,会反复进入伪断点,报错信息如下:
Thread 8 "async_tcp" received signal SIGTRAP, Trace/breakpoint trap.
Info : [esp32.cpu0] Target halted, PC=0x40092612, debug_reason=00000001
AsyncWebServer::_rewriteRequest (this=, request=0x3ffd18ac) at .pio/libdeps/az-delivery-devkit-v4/ESP Async WebServer/src/WebServer.cpp:107
107 if (r->match(request)){
我的platformio.ini配置
[env:az-delivery-devkit-v4] platform = espressif32 board = az-delivery-devkit-v4 framework = arduino ;monitor_speed = 115200 debug_tool = esp-prog upload_protocol = esp-prog debug_init_break = tbreak setup debug_speed = 20000 ;build_type = debug ;debug_build_flags = -O0 -g -ggdb lib_deps = ESP Async WebServer bblanchon/ArduinoJson@^7.0.4 esphome/ESPAsyncWebServer-esphome@^3.1.0 esphome/AsyncTCP-esphome@^2.1.3
核心代码(SerialDebug为空函数)
void setup() { //Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); SerialDebug("Connecting to WiFi ..."); } SerialDebug("Local IP : %s", WiFi.localIP().toString()); // 路由配置 server.on("/login", // 路由 HTTP_POST, // HTTP方法(GET、POST、PUT、DELETE等) NULL, // GET请求对应的处理函数或lambda表达式 NULL, // 文件上传处理函数 OnLogin); // POST/PUT请求的请求体处理函数 server.on("/get_nb_core", // 路由 HTTP_POST, // HTTP方法(GET、POST、PUT、DELETE等) NULL, // GET请求对应的处理函数或lambda表达式 NULL, // 文件上传处理函数 OnGetNbCore); // POST/PUT请求的请求体处理函数 server.begin(); } void loop() { }
解决方案
1. 启用Debug编译模式
当前配置注释掉了Debug编译相关选项,导致编译器用Release模式编译,代码被优化后会出现调试错位、伪断点问题。取消注释以下两行:
build_type = debug debug_build_flags = -O0 -g -ggdb
-O0:关闭编译器优化,保证调试时机器码与源码一一对应-g -ggdb:生成完整调试信息,让JTAG能正确映射源码位置
2. 同步依赖库编译配置
第三方库默认可能用Release模式编译,和主程序Debug模式不兼容。在platformio.ini中添加配置,强制依赖库同步Debug编译:
build_flags = -DCORE_DEBUG_LEVEL=3 lib_ldf_mode = deep+
CORE_DEBUG_LEVEL=3:启用ESP32核心调试输出,辅助排查问题lib_ldf_mode = deep+:确保依赖库的编译规则与主程序保持一致
3. 调整JTAG调试速度
当前debug_speed = 20000(20kHz),如果调试不稳定,可尝试降低速度到10000,或根据ESP-PROG官方手册调整到适配的速率。
4. 临时忽略特定伪断点
如果以上方法无效,可在VS Code调试面板的「断点」列表中,右键点击WebServer.cpp:107位置的断点选择「禁用」,临时跳过该伪断点。
内容的提问来源于stack exchange,提问作者JPBlanc

