Well, basically single step it through and find out where you're colliding.
I know, you didn't want to hear that...
Usually the most common problem, at least for me, is a tendency to write your interupt handler such that it thinks it's the only one in there. Then when a second interupt occurs, it's out of sync.
For example, you have a flag byte. One interupt sets bits 3 and 7, the other 2 and 6. But if you're ISR reads the flag byte, plays with it, then writes it back out, that can be a problem, since the other ISR can get in and read and write between your read and write. The result is that one ISR essentially erases what the other ISR has done.
The other problem, harder to find, is when one interupt does something the other ISR depends on. And not just in the ISR itself. This can get tricky when the ISR calls outside 'foreground' tasks. What if the ISR calls the outside foreground task while the outside task is currently being executed? Have to watch for those collisions too.
There's not a good solid hint here. It's a 'mindset' that you have to have to write ISRs. And the only real way to find the problems is to just set down and start single stepping...