Under Unix style operating systems, when a program faults in some way (SIGSEGV,SIGABRT,etc...) and permissions allow (the PWD is writable, ulimit(1)'s permit), then the kernel will write out a copy of the program's address space, as well as the state of all the registers and any other state that's required to a file, usually called "core" or "core.programname".
To change the name of the core file on linux, look at /proc/sys/kernel/core_pattern

Programs such as gdb(1) can then parse these core files and give you some indication about /why/ the program crashed.

 strings core | grep ^_=


 file core

will usually tell you what program caused the core file.

13:06 < alastair> I tried head core
13:06 < alastair> but gave up soon after that
13:07 < Isomer> you kinda want tail
13:07 < Isomer> since argv[0] is near the top of the address space, not the
13:07 < Isomer> but finding argv[0] is just annoying without properly parsing
                the entire core file
13:08 < Isomer> so grepping the environment for the value of "_" (the current
                command) is the easiest approach

You can then use

 gdb program core

gdb has several commands you can use to inspect the core file, however the most useful of them is

 (gdb) bt full

this will usually display enough information that a programmer can figure out why the program crashed. When emailing a bug report to a programmer about a program that crashed, including a full backtrace (as per the previous command) will greatly improve the chances that the programmer will be able to find and fix the bug you encountered.

See the DeBugging page for more information and hints about gdb.