From ef475aa007acf8bb584c0f3511b306b1e9f32fe7 Mon Sep 17 00:00:00 2001
From: curt <curt>
Date: Wed, 5 Jun 2002 19:58:07 +0000
Subject: [PATCH] Initial revision of a script to facilitate debugging with
 valgrind.

---
 scripts/Makefile.am            |  2 +-
 scripts/debug/.cvsignore       |  2 +
 scripts/debug/Makefile.am      |  1 +
 scripts/debug/debug-fgfs       | 81 ++++++++++++++++++++++++++++++
 scripts/debug/sample.fgfs.supp | 91 ++++++++++++++++++++++++++++++++++
 5 files changed, 176 insertions(+), 1 deletion(-)
 create mode 100644 scripts/debug/.cvsignore
 create mode 100644 scripts/debug/Makefile.am
 create mode 100755 scripts/debug/debug-fgfs
 create mode 100644 scripts/debug/sample.fgfs.supp

diff --git a/scripts/Makefile.am b/scripts/Makefile.am
index 96fcb3e25..ab4494671 100644
--- a/scripts/Makefile.am
+++ b/scripts/Makefile.am
@@ -1 +1 @@
-SUBDIRS = python
+SUBDIRS = debug python
diff --git a/scripts/debug/.cvsignore b/scripts/debug/.cvsignore
new file mode 100644
index 000000000..c2f6e13d9
--- /dev/null
+++ b/scripts/debug/.cvsignore
@@ -0,0 +1,2 @@
+fgfs.supp
+core*
diff --git a/scripts/debug/Makefile.am b/scripts/debug/Makefile.am
new file mode 100644
index 000000000..954f6e141
--- /dev/null
+++ b/scripts/debug/Makefile.am
@@ -0,0 +1 @@
+EXTRA_DIST = debug-fgfs sample.fgfs.supp
diff --git a/scripts/debug/debug-fgfs b/scripts/debug/debug-fgfs
new file mode 100755
index 000000000..32c4f3015
--- /dev/null
+++ b/scripts/debug/debug-fgfs
@@ -0,0 +1,81 @@
+#!/usr/bin/bash
+# $Id$
+#
+#
+#  To use this script you need
+#  - a Linux 2.4 system with libc 2.2.* and at least XFree86 4.1
+#  - the valgrind debugger (http://developer.kde.org/~sewardj/)
+#  - 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="../FlightGear/src/Main/fgfs"
+opt="--disable-game-mode --disable-fullscreen --fdm=magic"
+
+
+
+gdb="--gdb-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	run fgfs with gdb
+		-i	interactive valgrind run (default)
+		-b	valgrind batch run
+		-c	start gdb with most recent core dump
+		-x	add some extra pedantic valgrind parameters
+		-h	show this help screen
+		EOF
+		exit 0
+		;;
+	-r)	cmd="$fgfs $opt" ;;
+	-g)	cmd="gdb -x .gdbinit $fgfs" ;;
+	-i)	cmd=""; gdb="" ;;
+	-b)	gdb="" ;;
+	-x)	extra="--single-step=yes --optimise=no --cleanup=no --dump-error=1" ;;
+	-c)	core=$(ls -t core*|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 exectuable $fgfs"
+	exit 2
+fi
+
+echo "set args $opt" > .gdbinit
+
+test -e fgfs.supp || head -14 sample.fgfs.supp > fgfs.supp
+
+test -z "$cmd" && cmd="nice valgrind $gdb --num-callers=10 --suppressions=fgfs.supp $extra $* $fgfs $opt"
+
+echo "command: $cmd"
+exec $cmd
+
diff --git a/scripts/debug/sample.fgfs.supp b/scripts/debug/sample.fgfs.supp
new file mode 100644
index 000000000..30519190e
--- /dev/null
+++ b/scripts/debug/sample.fgfs.supp
@@ -0,0 +1,91 @@
+# valgrind suppression rules for FlightGear
+
+# Format of this file is:
+# {
+#     name_of_suppression
+#     kind: one of Param Value1 Value2 Value4 Value8
+#               Cond Free Addr1 Addr2 Addr4 Addr8
+#     (if Param: name of system call param, if Free: name of free-ing fn)
+#     caller0 name, or /name/of/so/file.so
+#     caller1 name, or ditto
+#     (optionally: caller2 name)
+#     (optionally: caller3 name)
+#  }
+
+# sample rules for Linux kernel 2.4, glibc 2.2.4, XFree86 4.2.0, 3dfx
+
+{
+    _dlopen_signal_error(Addr1)
+    Addr1
+    fun:_dl_signal_error
+    fun:_dl_open
+    fun:dlopen_doit
+}
+
+{
+    _dl_signal_error(Addr4)
+    Addr4
+    fun:_dl_signal_error
+    fun:_dl_open
+    fun:dlopen_doit
+}
+
+{
+    memcpy(Addr1)
+    Addr1
+    fun:memcpy
+    fun:_dl_signal_error
+    fun:_dl_open
+    fun:dlopen_doit
+}
+
+{
+    memcpy(Addr4)
+    Addr4
+    fun:memcpy
+    fun:_dl_signal_error
+    fun:_dl_open
+    fun:dlopen_doit
+}
+
+{
+    ioctl(generic)/(Param)
+    Param
+    ioctl(generic)
+    fun:__ioctl
+    fun:driMesaCreateScreen
+    fun:__driCreateScreen
+}
+
+{
+    Mesa/texsubimage2d...(Addr1)
+    Addr1
+    fun:texsubimage2d_*_to_*
+    fun:convert_texsubimage2d_*
+    fun:_mesa_convert_texsubimage2d
+    fun:tdfxDDTexImage2D
+}
+
+{
+    Mesa/texsubimage2d...(Addr4)
+    Addr4
+    fun:texsubimage2d_*_to_*
+    fun:convert_texsubimage2d_*
+    fun:_mesa_convert_texsubimage2d
+    fun:tdfxDDTexImage2D
+}
+
+{
+    Mesa/texsubimage2d...(Value1)
+    Value1
+    fun:texsubimage2d_*_to_*
+    fun:convert_texsubimage2d_*
+    fun:_mesa_convert_texsubimage2d
+    fun:tdfxDDTexImage2D
+}
+
+{
+    known-plib-bug/already_reported(Cond)
+    Cond
+    fun:removeEntity__7ssgListUi
+}