In particular, I'd emphasise the recommendation of Joseph Yiu's Definitive Guide books.
A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
Recover how? In the sense of fixing the source code, or continuing execution?
Usually you should be able to relate the failing assembler code to something you were doing in C, ie accessing a pointer, touching memory incorrectly, returning from a subroutine, etc. Several diagnostic dumping routines have been posted here over the years, review some of those.
Continuing execution would take some serious skillz, you'd have to unpack the instruction flow and figure out how to remediate the situation before returning and rerunning the code, or advancing the code. It might be easier to use some try/catch exception code where you could at least manage and contain the failure.
Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..