Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

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...

share|improve this question
add comment

4 Answers

up vote 8 down vote accepted

There might be a better way, but this kind of automates it.

Put the following in ~/backtrace:

backtrace
quit

Put this in a script called seg_wrapper.sh in a directory in your path:

#!/bin/bash
ulimit -c unlimited
"$@"
if [[ $? -eq 139 ]]; then
    gdb -q $1 core -x ~/backtrace
fi

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 quite (no intro message), and -x tells gdb to exit commands in the file given to it.

Usage:
So to use it you would just:

seg_wrapper.sh ./mycommand and its arguments

Update:
You could also write a signal handler that does this, see this link.

share|improve this answer
add comment

You need everyone's friend GDB

gdb <program> [core file]

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.

share|improve this answer
    
Is there a way to get it just to print the backtrace and exit? –  Neil Sep 2 '09 at 19:31
add comment

Sorry to come in here 2 years later ... stumbled upon while looking for something else. Adding this for completeness.

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

LD_PRELOAD=...path-to.../libSegFault.so myapp

You would get a report with backtrace, loaded libs, etc

A wrapper script catchsegv is also available that would attempt to use addr2line to translate addresses to filename + line number.

These are much lighter solutions than core files or gdb (good for embedded systems for example)

share|improve this answer
add comment

Ubuntu (as a project) uses Apport to do this. You can look how they did it.

https://wiki.ubuntu.com/Apport

share|improve this answer
    
+1: Apport mentions some useful mechanisms I wasn't familiar with, like /proc/sys/kernel/core_pattern –  RobM Dec 13 '11 at 13:38
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.