317 lines
12 KiB
Bash
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 ""
|