Problem in using MPU6050 via I2CDev and DMP library without interrupt

I want to read roll-pitch-yaw angles via IMU module MPU-6050 (GY-521) in a polling mode (no interrupts).
Problem is, after a while and rather randomly, the serial monitor hangs/freezes and no further data would be printed.
I've tested both RAW and DMP examples provided with the library and they work but the former is just raw noisy data and the latter uses interrupt #2.

Here is my code uploaded to Uno @16Mhz:

/*
   This codes retrieves roll, pitch, yaw angles from DMP of
   MPU6050 without the use of interrupt

   MPU6050 I2Cdevlib's default data rate for DMP is 100 Hz
   but DMP itself works @200Hz always

*/

#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
#include "Wire.h"

MPU6050 imu;

// MPU6050 control/status variables
bool dmpReady = false;
uint8_t devStatus;
uint16_t packetSize;
uint16_t fifoCount;
uint8_t fifoBuffer[64];

Quaternion q;
VectorFloat gravity;
float ypr[3];

void setup() {
  Wire.begin();
  Wire.setClock(400000);
  Serial.begin(57600);
  Serial.println(F("Initializing MPU6050..."));
  // powering on the device and setting accelRange to +- 2g and gyroRange ro +- 250 dps
  imu.initialize();

  Serial.println(F("Testing MPU6050 connection..."));
  Serial.println(imu.testConnection() ? F("MPU connection successful") : F("MPU connection failed"));
  Serial.println(F("Initializing DMP..."));
  devStatus = imu.dmpInitialize();

  // Offset values from running the example sketch IMU_ZERO
  imu.setXAccelOffset(959);
  imu.setYAccelOffset(-1471);
  imu.setZAccelOffset(927);
  imu.setXGyroOffset(-57);
  imu.setYGyroOffset(46);
  imu.setZGyroOffset(15);

  if (devStatus == 0) {
    Serial.println(F("Enabling DMP..."));
    imu.setDMPEnabled(true);
    dmpReady = true;

    packetSize = imu.dmpGetFIFOPacketSize();
  } else {
    // Error!
    // 1 = initial memory load failed
    // 2 = DMP configuration updates failed
    Serial.print(F("DMP Initialization failed (code )"));
    Serial.print(devStatus);
    Serial.println(F(")"));
  }

}
unsigned long t1, t2;
void loop() {
  if (!dmpReady) {
    Serial.println(F("DMP was not ready!"));
    return;
  }

  t1 = micros();
  fifoCount = imu.getFIFOCount();
  if (fifoCount == 1024) {
    imu.resetFIFO();
    Serial.println(F("FIFO overflow!"));
  }
  if (fifoCount >= 42) {
    imu.getFIFOBytes(fifoBuffer, packetSize);
    imu.resetFIFO();
  }
  t2 = micros();

  imu.dmpGetQuaternion(&q, fifoBuffer);
  imu.dmpGetGravity(&gravity, &q);
  imu.dmpGetYawPitchRoll(ypr, &q, &gravity);
  Serial.print("ypr\t");
  Serial.print(ypr[0] * 180 / M_PI);
  Serial.print("\t");
  Serial.print(ypr[1] * 180 / M_PI);
  Serial.print("\t");
  Serial.print(ypr[2] * 180 / M_PI);
  Serial.print("\t");
  Serial.print("time = ");
  Serial.println(t2 - t1);
}

And here is a few lines of the output (module is resting on the table):

ypr	34.18	-3.03	-0.05	time = 2208
ypr	34.18	-3.03	-0.05	time = 208
ypr	34.18	-3.03	-0.05	time = 2220
ypr	34.18	-3.03	-0.05	time = 208
ypr	34.18	-3.03	-0.05	time = 2192
ypr	34.18	-3.03	-0.05	time = 208
ypr	34.18	-3.03	-0.05	time = 2216
ypr	34.18	-3.03	-0.05	time = 2192
ypr	34.18	-3.03	-0.05	time = 208
ypr	34.18	-3.03	-0.05	time = 2208
ypr	34.18	-3.03	-0.05	time = 208
ypr	34.18	-3.04	-0.05	time = 2208
ypr	34.18	-3.04	-0.05	time = 2192
ypr	34.18	-3.04	-0.05	time = 208
ypr	34.18	-3.04	-0.05	time = 2220
ypr	34.18	-3.04	-0.05	time = 208
ypr	34.18	-3.04	-0.05	time = 2220
ypr	34.18	-3.04	-0.05	time = 2192
ypr	34.18	-3.04	-0.05	time = 208
ypr	34.18	-3.04	-0.05	time = 2196
ypr	34.18	-3.04	-0.05	time = 208
ypr	34.18	-3.04	-0.04	time = 2220
ypr	34.18	-3.04	-0.04	time = 208

Any help is appreciated.
Thanks.