PIO Debugger stopping in main() but not at my breakpont in setup() or loop()

Hello everyone, as my title suggests, PIO Debugger is stopping in main() but not at my breakpoint in setup() or loop(), as shown in the image below.
It stops in main()

but not at my breakpoint.

Here is my code main.cpp

#include <SPI.h>
#include <Ethernet.h>

// Pin Definitions

// Network Configuration
byte mac[] = { 0xA8, 0x61, 0x0A, 0xAE, 0x0A, 0xCC };
IPAddress server(192, 168, 123, 209);  // ModbusTCP server address
IPAddress localIP(192, 168, 123, 207); // Local IP address as slave
EthernetClient ethClient;
EthernetServer slaveServer(502);        // Modbus slave server

// ModbusTCP Configuration
uint16_t transactionId = 0;
uint16_t holdingRegisters[100];         // Holding registers array
bool isMasterMode = true;               // Mode switching flag
unsigned long modeChangeTimer = 0;       // Mode change timer
const unsigned long MODE_CHANGE_INTERVAL = 5000; // Mode change interval(ms)

unsigned long requestStartTime = 0;  // Request start time
unsigned long lastRequestTime = 0;   // Last request time
const unsigned long REQUEST_INTERVAL = 2000000; // 2 seconds = 2000000 microseconds

void sendModbusRequest(byte slaveId, byte functionCode, uint16_t startAddr, uint16_t quantity) {
  byte request[12];
  
  // Modbus TCP Frame Header
  request[0] = highByte(transactionId);
  request[1] = lowByte(transactionId++);
  request[2] = 0x00; // Protocol Identifier High Byte
  request[3] = 0x00; // Protocol Identifier Low Byte
  request[4] = 0x00; // Length High Byte
  request[5] = 0x06; // Length Low Byte
  request[6] = slaveId;
  request[7] = functionCode;
  request[8] = highByte(startAddr);
  request[9] = lowByte(startAddr);
  request[10] = highByte(quantity);
  request[11] = lowByte(quantity);
  
  ethClient.write(request, 12);
}

void processModbusRequest(EthernetClient &client, byte *buffer, int len) {
  uint16_t transId = (buffer[0] << 8) | buffer[1];
  byte functionCode = buffer[7];
  uint16_t startAddr = (buffer[8] << 8) | buffer[9];
  uint16_t quantity = (buffer[10] << 8) | buffer[11];
  
  if(functionCode == 0x03) {  // Read Holding Registers
    byte response[256];
    int responseLen = 9;  // MBAP header(7) + Function code(1) + Byte count(1)
    
    // Fill response header
    response[0] = buffer[0];  // Transaction ID
    response[1] = buffer[1];
    response[2] = 0x00;       // Protocol ID
    response[3] = 0x00;
    response[4] = 0x00;       // Length High Byte (filled later)
    response[5] = 0x00;       // Length Low Byte (filled later)
    response[6] = buffer[6];  // Unit ID
    response[7] = functionCode;
    response[8] = quantity * 2; // Byte count
    
    // Fill data
    for(int i = 0; i < quantity; i++) {
      response[responseLen++] = highByte(holdingRegisters[startAddr + i]);
      response[responseLen++] = lowByte(holdingRegisters[startAddr + i]);
    }
    
    // Update length field
    response[4] = highByte(responseLen - 6);
    response[5] = lowByte(responseLen - 6);
    
    client.write(response, responseLen);
  }
}

void readModbusResponse() {
  byte buffer[256];
  int len = 0;
  
  while (ethClient.available() && len < 256) {
    buffer[len++] = ethClient.read();
  }
  
  if (len > 0) {
    Serial.print("Response received, length: ");
    Serial.println(len);
    Serial.print("Data content: ");
    
    // Print each byte in hexadecimal format
    for(int i = 0; i < len; i++) {
      if(buffer[i] < 0x10) {
        Serial.print("0"); // Add leading zero
      }
      Serial.print(buffer[i], HEX);
      Serial.print(" ");
    }
    Serial.println(); // New line
    
    // Parse Modbus response
    if(len >= 9 && buffer[7] == 0x03) {  // Verify read holding register response
      byte dataLen = buffer[8];  // Number of data bytes
      if(len >= (9 + dataLen)) {
        uint16_t registerValue = (buffer[9] << 8) | buffer[10];  // Combine high and low bytes
        Serial.print("Register value: ");
        Serial.println(registerValue);
        unsigned long responseTime = micros() - requestStartTime;  // Calculate response time
        
        Serial.print("Response time (microseconds): ");
        Serial.println(responseTime);
      }
    }
  }
}


void runMasterMode() {
  if (!ethClient.connected()) {
    if (ethClient.connect(server, 502)) {
      Serial.println("Connected to Modbus server");
    } else {
      Serial.println("Connection failed");
      return;
    }
  }
  
  // Check if sending interval has elapsed
  if (micros() - lastRequestTime >= REQUEST_INTERVAL) {
    requestStartTime = micros();  // Record sending time
    sendModbusRequest(0x01, 0x03, 0x0000, 0x0001);
    lastRequestTime = micros();
  }
  
  if (ethClient.available()) {
    readModbusResponse();
  }
}

void runSlaveMode() {
  EthernetClient client = slaveServer.available();
  if (client) {
    byte buffer[256];
    int len = 0;
    
    while (client.available() && len < 256) {
      buffer[len++] = client.read();
    }
    
    if(len >= 12) {  // Minimum Modbus TCP frame length
      processModbusRequest(client, buffer, len);
    }
  }
}

void setup() {
  Serial.begin(9600);  // Initialize Serial for debugging

  // Initialize Ethernet
  Ethernet.begin(mac, localIP);
  slaveServer.begin();
  
  // Initialize default register values
  for(int i = 0; i < 100; i++) {
    holdingRegisters[i] = i + 1;
  }
}

void loop() {
  // Switch between master/slave mode based on timer
  if(millis() - modeChangeTimer >= MODE_CHANGE_INTERVAL) {
    isMasterMode = !isMasterMode;
    modeChangeTimer = millis();
    Serial.print("Switching to ");
    Serial.println(isMasterMode ? "Master Mode" : "Slave Mode");
  }

  if(isMasterMode) {
    runMasterMode();
  } else {
    runSlaveMode();
  }
}


and my platformio.ini.

; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env:due]
platform = atmelsam
board = due
framework = arduino
debug_tool = stlink
upload_protocol = stlink
board_upload.offset_address = 0x80000

I have looked into solutions for similar issues, but they don’t seem to work for me.
I am using an Arduino DUE and an ST-Link V2.
Please help, thank you all!

When in this situation, you press the Play button, does it hit the breakpiont?

If not, press Pause. Where did it halt?

You might also need to actually press the green restart button for debugging to function correctly with boards using a bootloader.

No, it doesn’t.

When I press Pause at different times, it may stay at different positions.Such as


and

image

Are you talking about this green button? I pressed it, but the situation hasn’t changed. :sob:Is there any other way?

Interesting, it seems to be executing the code, just not breaking at the start, or attaching too late.

What happens when you stop debugging again and directly say

debug_init_break = b loop

(docs)? Does it halt at loop()?

Place breakpoint on lines 53 and 59 on your first screen. And learn testing code with step over button. Your break dont work because code hang before…