3 # NVIDIA Graphics Driver bug reporting shell script. This shell
4 # script will generate a log file named "nvidia-bug-report.log", which
5 # should be attached when emailing bug reports to NVIDIA.
9 LOG_FILENAME=nvidia-bug-report.log
12 PATH="/sbin:/usr/sbin:$PATH"
15 NVIDIA_BUG_REPORT_CHANGE="$Change: 1833133 $"
16 NVIDIA_BUG_REPORT_VERSION=`echo $NVIDIA_BUG_REPORT_CHANGE | tr -c -d [:digit:]`
19 # append() - append the contents of the specified file to the log
23 echo "____________________________________________" >> $LOG_FILENAME
24 echo "" >> $LOG_FILENAME
26 if [ ! -f "$1" ]; then
27 echo "$1 does not exist" >> $LOG_FILENAME
28 elif [ ! -r "$1" ]; then
29 echo "$1 is not readable" >> $LOG_FILENAME
31 echo "$1" >> $LOG_FILENAME
32 cat "$1" >> $LOG_FILENAME
34 echo "" >> $LOG_FILENAME
38 # append_silent() - same as append(), but don't print anything
39 # if the file does not exist
43 if [ -f "$1" -a -r "$1" ]; then
44 echo "____________________________________________" >> $LOG_FILENAME
45 echo "" >> $LOG_FILENAME
46 echo "$1" >> $LOG_FILENAME
47 cat "$1" >> $LOG_FILENAME
48 echo "" >> $LOG_FILENAME
53 # append_glob() - use the shell to expand a list of files, and invoke
54 # append() for each of them
58 for i in `ls $1 2> /dev/null;`; do
64 # append_sysctl() - use sysctl to retrieve the value of interesting
65 # kernel or driver state variables.
69 echo "____________________________________________" >> $LOG_FILENAME
70 echo "" >> $LOG_FILENAME
72 sysctl=`which sysctl 2> /dev/null | head -n 1`
73 if [ $? -eq 0 -a "$sysctl" ]; then
74 value=`$sysctl $1 2> /dev/null`
75 if [ $? -eq 0 -a "$value" ]; then
76 echo "$value" >> $LOG_FILENAME
78 echo "$1 does not exist" >> $LOG_FILENAME
81 echo "sysctl not found" >> $LOG_FILENAME
91 # check that we are root (needed for `lspci -vxxx` and potentially for
92 # accessing kernel log files)
94 if [ `id -u` -ne 0 ]; then
95 echo "ERROR: Please run $(basename $0) as root."
100 # move any old log file out of the way
102 if [ -f $LOG_FILENAME ]; then
103 mv $LOG_FILENAME ${LOG_FILENAME}.old
107 # make sure what we can write to the log file
109 touch $LOG_FILENAME 2> /dev/null
111 if [ $? -ne 0 ]; then
113 echo "ERROR: Working directory is not writable; please cd to a directory"
114 echo " where you have write permission so that the $LOG_FILENAME"
115 echo " file can be written."
121 # print a start message to stdout
124 echo -n "Running $(basename $0)...";
127 # print prologue to the log file
129 echo "____________________________________________" >> $LOG_FILENAME
130 echo "" >> $LOG_FILENAME
131 echo "Start of NVIDIA bug report log file. Please send this" >> $LOG_FILENAME
132 echo "report along with a description of your bug, to" >> $LOG_FILENAME
133 echo "freebsd-gfx-bugs@nvidia.com." >> $LOG_FILENAME
134 echo "" >> $LOG_FILENAME
135 echo "nvidia-bug-report.sh Version: $NVIDIA_BUG_REPORT_VERSION" >> $LOG_FILENAME
136 echo "" >> $LOG_FILENAME
137 echo "Date: `date`" >> $LOG_FILENAME
138 echo "uname: `uname -a`" >> $LOG_FILENAME
139 echo "" >> $LOG_FILENAME
142 # append useful sysctl keys
144 append_sysctl "hw.nvidia.version"
145 append_sysctl "hw.nvidia.cards"
146 append_sysctl "hw.nvidia.agp"
147 append_sysctl "hw.nvidia.registry"
149 append_sysctl "vm.vmtotal"
150 append_sysctl "kern.version"
151 append_sysctl "kern.smp"
153 # append useful files
158 # append the X log; also, extract the config file named in the X log
161 for i in /var/log/XFree86.0.log /var/log/Xorg.0.log ; do
163 if [ -f $i -a -r $i ]; then
164 j=`grep "Using config file" $i | cut -f 2 -d \"`
171 vmstat=`which vmstat 2> /dev/null | head -n 1`
173 echo "____________________________________________" >> $LOG_FILENAME
174 echo "" >> $LOG_FILENAME
176 if [ $? -eq 0 -a "$vmstat" ]; then
177 echo "$vmstat" >> $LOG_FILENAME
178 echo "" >> $LOG_FILENAME
179 ( $vmstat >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
180 echo "" >> $LOG_FILENAME
181 echo "____________________________________________" >> $LOG_FILENAME
182 echo "" >> $LOG_FILENAME
183 echo "$vmstat -a -i" >> $LOG_FILENAME
184 echo "" >> $LOG_FILENAME
185 ( $vmstat -a -i >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
186 echo "" >> $LOG_FILENAME
188 echo "Skipping vmstat output (vmstat not found)" >> $LOG_FILENAME
189 echo "" >> $LOG_FILENAME
192 # append kldstat info
194 kldstat=`which kldstat 2> /dev/null | head -n 1`
196 echo "____________________________________________" >> $LOG_FILENAME
197 echo "" >> $LOG_FILENAME
199 if [ $? -eq 0 -a "$kldstat" ]; then
200 echo "$kldstat -v" >> $LOG_FILENAME
201 echo "" >> $LOG_FILENAME
202 ( $kldstat -v >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
203 echo "" >> $LOG_FILENAME
205 echo "Skipping kldstat output (kldstat not found)" >> $LOG_FILENAME
206 echo "" >> $LOG_FILENAME
212 glxinfo=`which glxinfo 2> /dev/null | head -n 1`
214 echo "____________________________________________" >> $LOG_FILENAME
215 echo "" >> $LOG_FILENAME
217 if [ $? -eq 0 -a "$glxinfo" ]; then
218 echo "ldd $glxinfo" >> $LOG_FILENAME
219 echo "" >> $LOG_FILENAME
220 ( ldd $glxinfo >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
221 echo "" >> $LOG_FILENAME
223 echo "Skipping ldd output (glxinfo not found)" >> $LOG_FILENAME
224 echo "" >> $LOG_FILENAME
227 # pciconf information
229 pciconf=`which pciconf 2> /dev/null | head -n 1`
231 echo "____________________________________________" >> $LOG_FILENAME
232 echo "" >> $LOG_FILENAME
234 if [ $? -eq 0 -a "$pciconf" ]; then
235 echo "$pciconf -l -v" >> $LOG_FILENAME
236 echo "" >> $LOG_FILENAME
237 ( $pciconf -l -v >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
238 echo "" >> $LOG_FILENAME
240 echo "Skipping pciconf output (pciconf not found)" >> $LOG_FILENAME
241 echo "" >> $LOG_FILENAME
244 # get any relevant kernel messages
246 echo "____________________________________________" >> $LOG_FILENAME
247 echo "" >> $LOG_FILENAME
248 echo "Scanning kernel log files for NVRM messages:" >> $LOG_FILENAME
249 echo "" >> $LOG_FILENAME
251 for i in /var/log/messages /var/log/kernel.log ; do
253 echo " $i:" >> $LOG_FILENAME
254 ( cat $i | grep NVRM >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
258 # append dmesg output
260 echo "" >> $LOG_FILENAME
261 echo "____________________________________________" >> $LOG_FILENAME
262 echo "" >> $LOG_FILENAME
263 echo "dmesg:" >> $LOG_FILENAME
264 echo "" >> $LOG_FILENAME
265 ( dmesg >> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
267 which gcc >/dev/null 2>&1
268 if [ $? -eq 0 ]; then
269 echo "____________________________________________" >> $LOG_FILENAME
270 echo "" >> $LOG_FILENAME
271 ( gcc -v 2>> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
274 which g++ >/dev/null 2>&1
275 if [ $? -eq 0 ]; then
276 echo "____________________________________________" >> $LOG_FILENAME
277 echo "" >> $LOG_FILENAME
278 ( g++ -v 2>> $LOG_FILENAME ; exit 0 ) > /dev/null 2>&1
281 echo "____________________________________________" >> $LOG_FILENAME
282 echo "" >> $LOG_FILENAME
283 echo "xset -q:" >> $LOG_FILENAME
284 echo "" >> $LOG_FILENAME
286 ( xset -q >> $LOG_FILENAME & sleep 1 ; kill -9 $! ) > /dev/null 2>&1
288 if [ $? -eq 0 ]; then
289 # The xset process is still there.
290 echo "xset could not connect to an X server" >> $LOG_FILENAME
293 echo "____________________________________________" >> $LOG_FILENAME
294 echo "" >> $LOG_FILENAME
295 echo "nvidia-settings -q all:" >> $LOG_FILENAME
296 echo "" >> $LOG_FILENAME
298 ( nvidia-settings -q all >> $LOG_FILENAME & sleep 1 ; kill -9 $! ) > /dev/null 2>&1
300 if [ $? -eq 0 ]; then
301 # The nvidia-settings process is still there.
302 echo "nvidia-settings could not connect to an X server" >> $LOG_FILENAME
304 echo "____________________________________________" >> $LOG_FILENAME
306 # print epilogue to log file
308 echo "" >> $LOG_FILENAME
309 echo "End of NVIDIA bug report log file." >> $LOG_FILENAME
316 echo "The file $LOG_FILENAME has been created; please send this"
317 echo "report, along with a description of your bug, to"
318 echo "freebsd-gfx-bugs@nvidia.com."