My question is how come atmega328P can print the statement which is in setup() more than one time ?
Clearly that happens because the Arduino is resetting, causing setup() to run again.
I know that use of Serial.println() in ISR is not appropriate but i am just using for debugging purpose it will not be present in my final design.
But it IS present in the code that is causing problems. Get rid of it, and see if the problem goes away.
i am using 1.6.5 IDE.
That version blocks if the outgoing serial buffer gets full, waiting for room. Room is made in the serial buffer by shifting data out, but that happens only when an interrupt happens, but interrupts don't happen when an interrupt service routine is running. So, if the buffer gets full, the Arduino will seem to hang.