Debugging is an art.
In general, debugging is the most admired tool in the developer's arsenal. My points in this article are related to GNU GDB debugger, for Linux operating system.
What is your first reaction when you see a core-dump?
Let's debug it!
Hold-on. Wait, and first ruminate over the problem. I'd suggest performing a few rituals before treading on to debugging would be helpful in saving time and effort.
o) Try to reproduce the problem. Ensure problem is consistent.
o) Check for the logs emitted by the application. If not available, see if you could get the logs.
o) Note down the application configuration, including the input, system configuration and every tiny detail that makes sense to you.
o) Okay, check the stack-frames with "backtrace".
o) You may inquire about frame locals and dig-in parent frames as well.
o) Also, it's useful to have a look at the code and a 2-3 level dry-run of code to reach at the point of failure. So, say you have a stack-trace as:
top() --> dumps core
Check how did we reach till top from say bar(). Look out for any ancillary function call in meanwhile and report its side-effect.
Remember, debugging is more than digging-deep; it's understanding the code tree and it's branches. Always approach to the problem on a high level, think what might have caused this failure.
Then, just jump in.