If I run a program from the shell, and it segfaults:
$ buggy_program
Segmentation fault
It will tell me, however, is there a way to get programs to print a backtrace, perhaps by running something like this:
$ print_backtrace_if_segfault buggy_program
Segfault in main.c:35
(rest of the backtrace)
I'd also rather not use strace or ltrace for that kind of information, as they'll print either way...
There might be a better way, but this kind of automates it.
Put the following in
~/backtrace
:Put this in a script called
seg_wrapper.sh
in a directory in your path:The
ulimit
command makes it so the core is dumped."$@"
are the arguments given to the script, so it would be your program and its arguments.$?
holds the exit status, 139 seems to be the default exit status for my machine for a segfault.For
gdb
,-q
means quiet (no intro message), and-x
tellsgdb
to execute commands in the file given to it.Usage
So to use it you would just:
Update
You could also write a signal handler that does this, see this link.
Sorry to come in here 2 years later ... stumbled upon while looking for something else. Adding this for completeness.
1) While I think the accepted answer is great, it requires gdb. The method I am familiar with uses libSegFault.so.
If you run your app with
You would get a report with backtrace, loaded libs, etc
2) A wrapper script
catchsegv
is also available that would attempt to useaddr2line
to translate addresses to filename + line number.These are much lighter solutions than core files or gdb (good for embedded systems for example)
catchsegv
It was mentioned in another answer (but in no way focused on). It's a handy tool bundled with the glibc project. It will provide a backtrace (and other useful debug information) only if a program does indeed segfault.
A good write up exists here.
You can include it in your own scripts as you see fit.
You need everyone's friend GDB
Once you've loaded your corefile, the command 'backtrace' (can be abbreviated to bt) will give you the current call stack. If you run your program from inside gdb, you can set arbitrary breakpoints and examine the memory contents, etc.
Ubuntu (as a project) uses Apport to do this. You can look how they did it.
https://wiki.ubuntu.com/Apport
Here is a slightly modified variant of the script from Kyle Brandt. It is improved in the following ways:
Script: