blob: c2c8c30ec439a191ae39bf3446ccfeec73b10c46 [file] [log] [blame]
#!/bin/sh
#
# This script uses gdb to grab a stacktrace of the given running process
# or thread. For a multi-threaded process, use 'ps ax -fL' to get a list
# of all its thread ids that you might want to trace.
#
# Realistically, this script is most useful for a program to call on
# itself upon receiving a signal like SIGSEGV.
#
die()
{
echo "$@" >&2
exit 1
}
[ -n "$1" ] || die "Usage: $0 <pid>"
pid=$1
[ -e "/proc/$pid/exe" ] || die "pid invalid: /proc/$pid/exe does not exist"
# need to run gdb on the master process to get backtraces for all threads
line=`grep '^Tgid:' /proc/$pid/status`
tgid=${line##* }
gdb --batch \
-ex "set heuristic-fence-post 100000" \
-ex "thread apply all bt" \
"/proc/$pid/exe" \
--pid "$tgid" \
</dev/null 2>&1 |
(
echo
echo '--CRASHDUMP-START--'
rv=2
while read level offset in func etc; do
if [ "$level" = Thread ]; then
echo "$level $offset $in $func $etc"
fi
if [ "$level" != "${level#\#}" ] && [ "$in" = "in" ]; then
rv=0
echo "$level $offset $func $etc"
fi
done
echo '--CRASHDUMP-END--'
echo
exit $rv
)