Intermittent failure to call C++ member function interrupt handler

I have an interrupt handler that looks like this:

void FX::handleFXInterrupt() {
  FXData d;
#if 0
  TRACE("handleFXInterrupt");
#endif
  interrupt_count += 1;
  
  trigger1();
  mag_interrupt_source = readByte(device, FXOS8700_M_INT_SOURCE);
  interrupt_source = readByte(device, FXOS8700_INT_SOURCE);

  while (interrupt_source | mag_interrupt_source) {

The attach looks like this:

ttachInterrupt(getInterruptPin(device), &FX::handleFXInterrupt, this, FALLING);

Part of the time this function is called properly in response to the pin interrupt and the stack walkback looks like this:

But a fraction of the time panic_ is called and the walkback looks like this:

Notice how similar the call sequence looks. It is as if it’s getting to prvGetRegistersFromStack because a bug is causing the wrong address to be passed to the C++ invocation code.

This has really ruined my day. I’ve got no choice but to make the handler a helper function instead of member function in the hope that deviceOS can get that right.

This is with deviceOS 2.1 (cannot use a more recent version). The hardware is an argon.