...adding to that, you will have information on the stack- r0-r3,r12,lr,pc,xpsr which you can look at to see where you came from (pc). In this case I would suspect it would be of no help since it appears this is a normal exception which could have taken place anywhere. If you end up in the hard fault exception as an example, the pc on the stack usually points to the code which caused the hard fault (unaligned address, bad address, etc.).
For my stm32 which I use no debugger, I have an error function in the startup file (like a default handler), which saves this stack info to some (noinit) ram set aside to store debug info. After the subsequent reset my main app can print out the debug info if wanted. Not needed very often but sometimes you make errors which usually show up right away, and with the pc info you can usually get the address of the problem code and get things sorted out quickly.
As already mentioned, enable the lss outout in the project settings. Get good at reading the lss file which is useful for debugging. In your example, assuming you're pretty sure the can handler function is in place and correctly named, the first thing I would look at is the lss listing, specifically the vector table entry for this irq. Its not going to be spelled out for you, but its easy enough to figure out where this entry should be (and of course you are looking at little-endian u32's). That address either points to the default handler or your can handler, and would guess it points to the former.