#!/bin/bash
# $Id$
#
#
#  To use this script you need
#  - a Linux system >=2.4 with libc >=2.2.*
#  - the valgrind debugger (http://www.valgrind.org/)
#  - lots of memory (RAM + swap space > 600MB!) and
#  - a fast computer =or= a lot of patience.
#
#  It is useful (but not required) to compile FlightGear without
#  any optimizations (-O0 without -funroll-loops etc.). Otherwise
#  the debug messages might not seem to make sense in some cases.
#
#  The sample suppression file is designed for a SuSE 7.1 system
#  with Linux 2.4.18, XFree86 4.2.0 and a 3dfx card. Don't use it
#  as it is, but create your own! You will likely have different
#  libraries with different bugs.
#
#  If you have problems with valgrind and FlightGear, don't bother
#  the valgrind author -- ask on the flightgear-devel list first!
#
#
# 
#  adapt the following two entries to your needs:
#
fgfs="../../src/Main/fgfs"
opt="--log-level=info --disable-game-mode --aircraft=ufo --geometry=800x600"

gdb="--db-attach=yes"
cmd=
extra=

while true; do
	case "$1" in
	-h|--help)	cat <<-EOF
		debug [-r] [-g] [-i] [-b] [-c] [-x] [-h]

		-r	run fgfs
		-g|-d	run fgfs with gdb
		-D	run fgfs with ddd
		-i	interactive valgrind run (default)
		-p	calltree profile run
		-b	valgrind batch run
		-c	start gdb with most recent core dump
		-s	print suppression info
		-l	enable leak/reachable check
		-h	show this help screen
		EOF
		exit 0
		;;
	-r)	cmd="$fgfs $opt" ;;
	-g|-d)	cmd="gdb -x .gdbinit $fgfs" ;;
	-D)	cmd="ddd -x .gdbinit $fgfs" ;;
	-m)	cmd="make -C ../.." ;;
	-i)	cmd=""; gdb="" ;;
	-p)	cmd="callgrind --dump-instr=yes --trace-jump=yes --dump-threads=yes $fgfs $opt"; gdb="" ;;
	-b)	gdb="" ;;
	-s)	extra="$extra --gen-suppressions=yes" ;;
	-l)	extra="$extra --leak-check=yes --show-reachable=yes" ;;
	-c)	core=$(ls -t core* 2>/dev/null|head -1)
		if test -z $core; then
			echo "$0: there's no core file"
			exit 1
		fi
		cmd="gdb $fgfs $core"
		;;
	*)	break ;;
	esac
	shift
done

if ! test -e "$fgfs"; then
	echo "$0: there's no fgfs executable $fgfs"
	exit 2
fi

echo "set args $opt" > .gdbinit
echo "handle SIG32 nostop noprint" >> .gdbinit		# work around gdb bug

test -e fgfs.supp || head -14 sample.fgfs.supp > fgfs.supp

test -z "$cmd" && cmd="nice valgrind \
	--tool=memcheck $gdb --num-callers=64 \
	--suppressions=fgfs.supp \
	--error-limit=no \
	$extra $* $fgfs $opt"

echo "command: $cmd"
#export LD_PRELOAD='/usr/lib/GL/libGL.so.1.3.mesasoft'
#export __GL_FORCE_GENERIC_CPU=1
exec $cmd