Micros() goes back in time oftenly

So, I've made a simple script to capture changes in a digital signal and just send them over serial back to my PC for further examination.

int recievePin = 2;

void setup() {
  Serial.begin(115200);
  attachInterrupt(digitalPinToInterrupt(recievePin),onRisingInterrupt, RISING);
}

void loop() {
  if(Serial.available() > 0){
    int readByte = Serial.read();
    if(readByte == 97){
      noInterrupts();
    }
  }
}

//Called on each rising signal
void onRisingInterrupt() {
  volatile unsigned long currentTime = micros();
  attachInterrupt(digitalPinToInterrupt(recievePin),onFallingInterrupt, FALLING);
  Serial.print(currentTime);
  Serial.println(" 1");
 
}


//Gets called on each falling edge
void onFallingInterrupt() {
  volatile unsigned long currentTime = micros();
  attachInterrupt(digitalPinToInterrupt(recievePin),onRisingInterrupt, RISING);
  Serial.print(currentTime);
  Serial.println(" 0");
}

But the problem with this script is that I keep getting time values that are smaller than the previous time value(examine attachment).

What is the reason for this strange behaviour, and how can I work around it?

First, read Gammon on Interrupts.

Don't serial.print inside the ISR. Just. Don't.

Why are you attaching an interrupt inside an interrupt?

ThatSava:
What is the reason for this strange behaviour, and how can I work around it?

The problem is probably cause by an ISR that takes too long. If interrupts are disabled for more than a millisecond the timer can drop an overflow interrupt (1024 microseconds). That's why you sometimes see -856 instead of +172.

Get the Serial.print() statements out of the ISR.

Avoiding Serial.print and Serial.println in interrupts seems to be my solution. What I instead did was store values in a buffer variable and print out values from that variable in the main loop.