Files
main/hardware/graphics/nvidia-xconfig/files/nvidia-bug-report.sh
T
2015-11-23 15:54:43 +01:00

317 lines
12 KiB
Bash

#!/bin/sh
# NVIDIA Graphics Driver bug reporting shell script. This shell
# script will generate a log file named "nvidia-bug-report.log", which
# should be attached when emailing bug reports to NVIDIA.
LOG_FILENAME=nvidia-bug-report.log
PATH="/sbin:/usr/sbin:$PATH"
NVIDIA_BUG_REPORT_CHANGE="$Change: 2074027 $"
NVIDIA_BUG_REPORT_VERSION=`echo $NVIDIA_BUG_REPORT_CHANGE | tr -c -d [:digit:]`
#
# append() - append the contents of the specified file to the log
#
append() {
echo "____________________________________________" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
if [ ! -f "$1" ]; then
echo "$1 does not exist" >> $LOG_FILENAME
elif [ ! -r "$1" ]; then
echo "$1 is not readable" >> $LOG_FILENAME
else
echo "$1" >> $LOG_FILENAME
cat "$1" >> $LOG_FILENAME
fi
echo "" >> $LOG_FILENAME
}
#
# append_silent() - same as append(), but don't print anything
# if the file does not exist
#
append_silent() {
if [ -f "$1" -a -r "$1" ]; then
echo "____________________________________________" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
echo "$1" >> $LOG_FILENAME
cat "$1" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
fi
}
#
# append_glob() - use the shell to expand a list of files, and invoke
# append() for each of them
#
append_glob() {
for i in `ls $1 2> /dev/null;`; do
append "$i"
done
}
#
# Start of script
#
# check that we are root (needed for `lspci -vxxx` and potentially for
# accessing kernel log files)
if [ `id -u` -ne 0 ]; then
echo "ERROR: Please run $(basename $0) as root."
exit 1
fi
# move any old log file out of the way
if [ -f $LOG_FILENAME ]; then
mv $LOG_FILENAME ${LOG_FILENAME}.old
fi
# make sure what we can write to the log file
touch $LOG_FILENAME 2> /dev/null
if [ $? -ne 0 ]; then
echo
echo "ERROR: Working directory is not writable; please cd to a directory"
echo " where you have write permission so that the $LOG_FILENAME"
echo " file can be written."
echo
exit 1
fi
# print a start message to stdout
echo ""
echo -n "Running $(basename $0)...";
# print prologue to the log file
echo "____________________________________________" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
echo "Start of NVIDIA bug report log file. Please send this report," >> $LOG_FILENAME
echo "along with a description of your bug, to linux-bugs@nvidia.com." >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
echo "nvidia-bug-report.sh Version: $NVIDIA_BUG_REPORT_VERSION" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
echo "Date: `date`" >> $LOG_FILENAME
echo "uname: `uname -a`" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
# append useful files
append "/proc/driver/nvidia/version"
append_glob "/proc/driver/nvidia/cards/*"
append_glob "/proc/driver/nvidia/agp/*"
append_glob "/proc/driver/nvidia/warnings/*"
append "/proc/driver/nvidia/registry"
append "/proc/cmdline"
append "/proc/cpuinfo"
append "/proc/interrupts"
append "/proc/meminfo"
append "/proc/modules"
append "/proc/version"
append "/proc/pci"
append "/proc/iomem"
append "/proc/mtrr"
append "/etc/issue"
append_silent "/etc/redhat-release"
append_silent "/etc/redhat_version"
append_silent "/etc/fedora-release"
append_silent "/etc/slackware-release"
append_silent "/etc/slackware-version"
append_silent "/etc/debian_release"
append_silent "/etc/debian_version"
append_silent "/etc/mandrake-release"
append_silent "/etc/yellowdog-release"
append_silent "/etc/sun-release"
append_silent "/etc/release"
append_silent "/etc/gentoo-release"
append "/var/log/nvidia-installer.log"
# append the X log; also, extract the config file named in the X log
# and append it
for i in /var/log/XFree86.0.log /var/log/Xorg.0.log ; do
append "$i"
if [ -f $i -a -r $i ]; then
j=`grep "Using config file" $i | cut -f 2 -d \"`
append "$j"
fi
done
# append ldd info
glxinfo=`which glxinfo 2> /dev/null | head -n 1`
echo "____________________________________________" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
if [ $? -eq 0 -a "$glxinfo" ]; then
echo "ldd $glxinfo" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
( ldd $glxinfo >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
echo "" >> $LOG_FILENAME
else
echo "Skipping ldd output (glxinfo not found)" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
fi
# lspci information
lspci=`which lspci 2> /dev/null | head -n 1`
echo "____________________________________________" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
if [ $? -eq 0 -a "$lspci" ]; then
echo "$lspci -d \"10de:*\" -v -xxx" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
( $lspci -d "10de:*" -v -xxx >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
echo "" >> $LOG_FILENAME
echo "____________________________________________" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
echo "$lspci -t" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
( $lspci -t >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
echo "" >> $LOG_FILENAME
else
echo "Skipping lspci output (lspci not found)" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
fi
# dmidecode
dmidecode=`which dmidecode 2> /dev/null | head -n 1`
echo "____________________________________________" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
if [ $? -eq 0 -a "$dmidecode" ]; then
echo "$dmidecode" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
( $dmidecode >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
echo "" >> $LOG_FILENAME
else
echo "Skipping dmidecode output (dmidecode not found)" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
fi
# module version magic
modinfo=`which modinfo 2> /dev/null | head -n 1`
echo "____________________________________________" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
if [ $? -eq 0 -a "$modinfo" ]; then
echo "$modinfo nvidia | grep vermagic" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
( $modinfo nvidia | grep vermagic >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
echo "" >> $LOG_FILENAME
else
echo "Skipping modinfo output (modinfo not found)" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
fi
# get any relevant kernel messages
echo "____________________________________________" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
echo "Scanning kernel log files for NVRM messages:" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
for i in /var/log/messages /var/log/kernel.log ; do
if [ -f $i ]; then
echo " $i:" >> $LOG_FILENAME
( cat $i | grep NVRM >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
fi
done
# append dmesg output
echo "" >> $LOG_FILENAME
echo "____________________________________________" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
echo "dmesg:" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
( dmesg >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
which gcc >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "____________________________________________" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
( gcc -v 2>> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
fi
which g++ >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "____________________________________________" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
( g++ -v 2>> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
fi
echo "____________________________________________" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
echo "xset -q:" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
( xset -q >> $LOG_FILENAME & sleep 1 ; kill -9 $! ) > /dev/null 2>&1
if [ $? -eq 0 ]; then
# The xset process is still there.
echo "xset could not connect to an X server" >> $LOG_FILENAME
fi
echo "____________________________________________" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
echo "nvidia-settings -q all:" >> $LOG_FILENAME
echo "" >> $LOG_FILENAME
( nvidia-settings -q all >> $LOG_FILENAME & sleep 1 ; kill -9 $! ) > /dev/null 2>&1
if [ $? -eq 0 ]; then
# The nvidia-settings process is still there.
echo "nvidia-settings could not connect to an X server" >> $LOG_FILENAME
fi
echo "____________________________________________" >> $LOG_FILENAME
# print epilogue to log file
echo "" >> $LOG_FILENAME
echo "End of NVIDIA bug report log file." >> $LOG_FILENAME
# Done
echo " complete."
echo ""
echo "The file $LOG_FILENAME has been created; please send this report,"
echo "along with a description of your bug, to linux-bugs@nvidia.com."
echo ""