从函数返回 char 数组时崩溃
Crash when returning a char array from a function
我和一个朋友一起在 ESP32 网络服务器上工作,但我们遇到了瓶颈。哥们都快放弃了,我技术不如他
我们有以下功能,编译正常,但导致 ESP32 崩溃。
经过大量调试后,我很确定在尝试 return c
时会发生崩溃
void handle_logs_view(String path){
char** list = sdcard_list_files(path);
for (int i=0;list[i]!=NULL;i++){
Serial.println(list[i]);
}
}
char** sdcard_list_files(String path){
Serial.println("Listing files for "+path);
if (path.compareTo("/")){
char* c[]={"dir1","file1.log","file2.log","file3.log","file4.log","file5.log",NULL};
return c;
}
return NULL;
}
#endif
异常解码结果如下:
PC: 0x400d1d1b: handle_logs_view(String) at C:\Users\MickW\Downloads\Front_End-11_create_file_explorer\Front_End-11_create_file_explorer\sample_code\WIFITest/WIFITest.ino line 45
EXCVADDR: 0x00000000
Decoding stack results
0x400d1d1b: handle_logs_view(String) at C:\Users\MickW\Downloads\Front_End-11_create_file_explorer\Front_End-11_create_file_explorer\sample_code\WIFITest/WIFITest.ino line 45
0x400d1e7e: std::_Function_handler >::_M_invoke(const std::_Any_data &) at C:\Users\MickW\AppData\Local\Temp\arduino_build_351256\sketch\WebServer.cpp line 32
0x400d68ff: std::function ::operator()() const at c:\users\mickw\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc.22.0-97-gc752ad5-5.2.0\xtensa-esp32-elf\include\c++.2.0/functional line 2271
0x400d69a5: FunctionRequestHandler::handle(WebServer&, HTTPMethod, String) at C:\Users\MickW\Documents\Arduino\hardware\espressif\esp32\libraries\WebServer\src\detail/RequestHandlersImpl.h line 45
0x400d6a12: WebServer::_handleRequest() at C:\Users\MickW\Documents\Arduino\hardware\espressif\esp32\libraries\WebServer\src\WebServer.cpp line 633
0x400d6b8d: WebServer::handleClient() at C:\Users\MickW\Documents\Arduino\hardware\espressif\esp32\libraries\WebServer\src\WebServer.cpp line 314
0x400d1d6e: loop() at C:\Users\MickW\Downloads\Front_End-11_create_file_explorer\Front_End-11_create_file_explorer\sample_code\WIFITest/WIFITest.ino line 22
0x400d8ad5: loopTask(void*) at C:\Users\MickW\Documents\Arduino\hardware\espressif\esp32\cores\esp32\main.cpp line 23
0x40089552: vPortTaskWrapper at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/freertos/port.c line 143
本文来自乐鑫网站:
禁止加载,禁止存储
当应用程序尝试读取或写入无效内存位置时,会发生此 CPU 异常。在寄存器转储的 EXCVADDR 寄存器中可以找到 written/read 的地址。如果此地址为零,通常意味着应用程序试图取消引用 NULL 指针。
如果有任何帮助或建议,我将不胜感激
您正在 return 指向自动(即基于堆栈的)变量的指针。该变量在 sdcard_list_files
return 时消失,留下指针“悬空”。
一种解决方案是将 c
声明为 static
。另一个(在 C++ 中)是 return a std::optional <std::array<std::string>, 6>>
.
c
应该声明为 static
,最好在代码的顶层。在您的示例中,c
在堆栈上声明,并在 sdcard_list_files()
returns 时消失。使用 static
属性声明 c
将解决此问题。
我和一个朋友一起在 ESP32 网络服务器上工作,但我们遇到了瓶颈。哥们都快放弃了,我技术不如他
我们有以下功能,编译正常,但导致 ESP32 崩溃。
经过大量调试后,我很确定在尝试 return c
void handle_logs_view(String path){
char** list = sdcard_list_files(path);
for (int i=0;list[i]!=NULL;i++){
Serial.println(list[i]);
}
}
char** sdcard_list_files(String path){
Serial.println("Listing files for "+path);
if (path.compareTo("/")){
char* c[]={"dir1","file1.log","file2.log","file3.log","file4.log","file5.log",NULL};
return c;
}
return NULL;
}
#endif
异常解码结果如下:
PC: 0x400d1d1b: handle_logs_view(String) at C:\Users\MickW\Downloads\Front_End-11_create_file_explorer\Front_End-11_create_file_explorer\sample_code\WIFITest/WIFITest.ino line 45
EXCVADDR: 0x00000000
Decoding stack results
0x400d1d1b: handle_logs_view(String) at C:\Users\MickW\Downloads\Front_End-11_create_file_explorer\Front_End-11_create_file_explorer\sample_code\WIFITest/WIFITest.ino line 45
0x400d1e7e: std::_Function_handler >::_M_invoke(const std::_Any_data &) at C:\Users\MickW\AppData\Local\Temp\arduino_build_351256\sketch\WebServer.cpp line 32
0x400d68ff: std::function ::operator()() const at c:\users\mickw\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc.22.0-97-gc752ad5-5.2.0\xtensa-esp32-elf\include\c++.2.0/functional line 2271
0x400d69a5: FunctionRequestHandler::handle(WebServer&, HTTPMethod, String) at C:\Users\MickW\Documents\Arduino\hardware\espressif\esp32\libraries\WebServer\src\detail/RequestHandlersImpl.h line 45
0x400d6a12: WebServer::_handleRequest() at C:\Users\MickW\Documents\Arduino\hardware\espressif\esp32\libraries\WebServer\src\WebServer.cpp line 633
0x400d6b8d: WebServer::handleClient() at C:\Users\MickW\Documents\Arduino\hardware\espressif\esp32\libraries\WebServer\src\WebServer.cpp line 314
0x400d1d6e: loop() at C:\Users\MickW\Downloads\Front_End-11_create_file_explorer\Front_End-11_create_file_explorer\sample_code\WIFITest/WIFITest.ino line 22
0x400d8ad5: loopTask(void*) at C:\Users\MickW\Documents\Arduino\hardware\espressif\esp32\cores\esp32\main.cpp line 23
0x40089552: vPortTaskWrapper at /Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/freertos/port.c line 143
本文来自乐鑫网站:
禁止加载,禁止存储
当应用程序尝试读取或写入无效内存位置时,会发生此 CPU 异常。在寄存器转储的 EXCVADDR 寄存器中可以找到 written/read 的地址。如果此地址为零,通常意味着应用程序试图取消引用 NULL 指针。
如果有任何帮助或建议,我将不胜感激
您正在 return 指向自动(即基于堆栈的)变量的指针。该变量在 sdcard_list_files
return 时消失,留下指针“悬空”。
一种解决方案是将 c
声明为 static
。另一个(在 C++ 中)是 return a std::optional <std::array<std::string>, 6>>
.
c
应该声明为 static
,最好在代码的顶层。在您的示例中,c
在堆栈上声明,并在 sdcard_list_files()
returns 时消失。使用 static
属性声明 c
将解决此问题。