Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sometimes crashes occur after calling deinit(false) #803

Open
pikkaru opened this issue Dec 15, 2024 · 4 comments
Open

Sometimes crashes occur after calling deinit(false) #803

pikkaru opened this issue Dec 15, 2024 · 4 comments

Comments

@pikkaru
Copy link

pikkaru commented Dec 15, 2024

I found this phenomenon when I was testing with version 1.4.2 at first, but the same phenomenon seems to occur when I test with 2.1.0 with modified code to be able to compile in that
environment. I use ESP32 Dev Module and Arduino Core for ESP32 v2.0.15.

Here is the part of my code(The ~ part omits code that is irrelevant to the BLE process):

          ~~~~~~~~~~~
          NimBLEDevice::init(ble_name);
          ~~~~~~~~~~~
          pStartupConfigServer = NimBLEDevice::createServer();
          pStartupConfigServer->setCallbacks(new ConfigServerCallbacks());
          NimBLEService *pService = pStartupConfigServer->createService(CONFIGSERVICE_UUID);
          pTxconfigCharacteristic = pService->createCharacteristic(
                        CONFIGCHARACTERISTIC_UUID_TX,
                        NIMBLE_PROPERTY::NOTIFY
                      );
          NimBLECharacteristic * pRxconfigCharacteristic = pService->createCharacteristic(
                        CONFIGCHARACTERISTIC_UUID_RX,
                        NIMBLE_PROPERTY::WRITE
                      );
          pRxconfigCharacteristic->setCallbacks(new ConfigChrCallbacks());
          pService->start();
          pConfigServer->getAdvertising()->start();
          bool ble_conf_test_flag = true;
          while (ble_conf_test_flag == true){
            if (Serial.available()>0){
              uart_command = Serial.readStringUntil('\n');
              if (uart_command == "exit"){
                ble_conf_test_flag = false;
              }
            }
            if (deviceConnected && !oldDeviceConnected) {
                oldDeviceConnected = deviceConnected;
            }
            delay(10);
          }
          pConfigServer->getAdvertising()->stop();
          NimBLEDevice::deinit(false);
          ~~~~~~~~~~~
        }

and this is the error message:

18:15:41.475 -> Guru Meditation Error: Core  0 panic'ed (InstrFetchProhibited). Exception was unhandled.
18:15:41.475 -> 
18:15:41.475 -> Core  0 register dump:
18:15:41.475 -> PC      : 0x00000000  PS      : 0x00060230  A0      : 0x8009996b  A1      : 0x3ffd3c80  
18:15:41.475 -> A2      : 0x3ffdff64  A3      : 0x00000001  A4      : 0x00000001  A5      : 0x0000abb5  
18:15:41.521 -> A6      : 0x00000000  A7      : 0x00000001  A8      : 0x800f80bc  A9      : 0x3ffd3c60  
18:15:41.521 -> A10     : 0x3ffc87f0  A11     : 0x3ffc87f0  A12     : 0x3ffca5b8  A13     : 0x00060223  
18:15:41.521 -> A14     : 0x00060220  A15     : 0x00000001  SAR     : 0x00000013  EXCCAUSE: 0x00000014  
18:15:41.521 -> EXCVADDR: 0x00000000  LBEG    : 0x400924f8  LEND    : 0x4009250e  LCOUNT  : 0x00000000  
18:15:41.521 -> 
18:15:41.521 -> 
18:15:41.521 -> Backtrace: 0xfffffffd:0x3ffd3c80 0x40099968:0x3ffd3ca0
18:15:41.521 -> 
18:15:41.521 -> 
18:15:41.521 -> 
18:15:41.521 -> 
18:15:41.521 -> ELF file SHA256: 66693fbd39183016
18:15:41.521 -> 
18:15:41.848 -> Rebooting...
18:15:41.848 -> ets Jul 29 2019 12:21:46
18:15:41.848 -> 
18:15:41.848 -> rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
18:15:41.848 -> configsip: 0, SPIWP:0xee
18:15:41.848 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
18:15:41.848 -> mode:DIO, clock div:1
18:15:41.848 -> load:0x3fff0030,len:1344
18:15:41.848 -> load:0x40078000,len:13964
18:15:41.848 -> load:0x40080400,len:3600
18:15:41.848 -> entry 0x400805f0

I would like to add that I remember this happening very rarely in 1.4.1.
Calling the delay function between deinit and stop seems to alleviate the problem, but I cannot determine if this is the correct solution.

@h2zero
Copy link
Owner

h2zero commented Dec 15, 2024

From the look of that backtrace something is accessing a nullptr. I suggest to remove the call to stop and just let the deinit take care of it.

@pikkaru
Copy link
Author

pikkaru commented Dec 24, 2024

Thank you for your response. Currently the problem appears to be resolved. I would appreciate it if you could point me to a sample code that includes deinit, if you have one, as I have not been able to find it.

@h2zero
Copy link
Owner

h2zero commented Jan 4, 2025

The code you have there is a good example already. There is nothing special about deinit to show an example of really, the only thing to know is that is will stop all BLE activity and release the resources until init is called again.

@thekurtovic
Copy link
Contributor

@pikkaru You could add checks on the return values from init and deinit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants