564 lines
16 KiB
Perl
Executable File
564 lines
16 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
##Wine Quick Debug Report Maker Thingy (WQDRMK)
|
|
##By Adam Sacarny
|
|
##(c) 1998-1999
|
|
##Do not say this is yours without my express permisson, or I will
|
|
##hunt you down and kill you like the savage animal I am.
|
|
##
|
|
## Improvements by Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
|
|
## (c) 2000
|
|
##
|
|
## Released under the WINE licence.
|
|
##
|
|
##Changelog:
|
|
##August 29, 1999 - Work around for debugger exit (or lack thereof)
|
|
## - Should now put debugging output in correct place
|
|
##April 19, 1999 - Much nicer way to select wine's location
|
|
## - Option to disable creation of a debugging output
|
|
## - Now places debugging output where it was started
|
|
##April 4, 1999 - Sanity check for file locations/wine strippedness
|
|
## - Various code cleanups/fixes
|
|
##March 21, 1999 - Bash 2.0 STDERR workaround (Thanks Ryan Cumming!)
|
|
##March 1, 1999 - Check for stripped build
|
|
##February 3, 1999 - Fix to chdir to the program's directory
|
|
##February 1, 1999 - Cleaned up code
|
|
##January 26, 1999 - Fixed various bugs...
|
|
## - Made newbie mode easier
|
|
##January 25, 1999 - Initial Release
|
|
## -------------------------------------------
|
|
##| IRCNET/UNDERNET: jazzfan AOL: Jazzrock12 |
|
|
##| E-MAIL: magicbox@bestweb.net ICQ: 19617831|
|
|
##| Utah Jazz Page @ http://www.gojazz.net |
|
|
##| Wine Builds @ http://www.gojazz.net/wine |
|
|
## -------------------------------------------
|
|
sub do_var {
|
|
$var=$_[0];
|
|
$var =~ s/\t//g;
|
|
return $var;
|
|
}
|
|
open STDERR, ">&SAVEERR"; open STDERR, ">&STDOUT";
|
|
$ENV{'SHELL'}="/bin/bash";
|
|
$var0 = qq{
|
|
What is your level of WINE expertise? 1-newbie 2-intermediate 3-advanced
|
|
|
|
1 - Makes a debug report as defined in the WINE documentation. Best
|
|
for new WINE users. If you're not sure what -debugmsg is, then
|
|
use this mode.
|
|
2 - Makes a debug report that is more customizable (Example: you can
|
|
choose what -debugmsg 's to use). You are asked more questions in
|
|
this mode. May intimidate newbies.
|
|
3 - Just like 2, but not corner cutting. Assumes you know what you're
|
|
doing so it leaves out the long descriptions.
|
|
};
|
|
print do_var($var0)."\n";
|
|
until ($debuglevel >= 1 and $debuglevel <= 3) {
|
|
print "Enter your level of WINE expertise (1-3): ";
|
|
$debuglevel=<STDIN>;
|
|
chomp $debuglevel;
|
|
}
|
|
|
|
if ($debuglevel < 3) {
|
|
$var1 = qq{
|
|
This program will make a debug report for WINE developers. It generates
|
|
two files. The first one has everything asked for by the bugreports guide;
|
|
the second has *all* of the debug output, which can go to thousands of
|
|
lines.
|
|
To (hopefully) get the bug fixed, attach the first file to a messsage
|
|
sent to the comp.emulators.ms-windows.wine newsgroup. The developers
|
|
might ask you for "the last X lines from the report". If so, just
|
|
provide the output of the following command:
|
|
gzip -d (output file) | tail -n (X) > outfile
|
|
If you do not want to create one of the files, just specify "no file".
|
|
};
|
|
print do_var($var1);
|
|
} elsif ($debuglevel =~ 3) {
|
|
$var2 = qq{
|
|
This program will output to two files:
|
|
1. Formatted debug report you might want to post to the newsgroup
|
|
2. File with ALL the debug output (It will later be compressed with
|
|
gzip, so leave off the trailing .gz)
|
|
If you do not want to create one of the files, just type in "no file"
|
|
and I'll skip it.
|
|
};
|
|
print do_var($var2);
|
|
}
|
|
|
|
print "\nFilename for the formatted debug report: ";
|
|
$outfile=<STDIN>;
|
|
chomp $outfile;
|
|
$var23 = qq{
|
|
I don't think you typed in the right filename. Let's try again.
|
|
};
|
|
while ($outfile =~ /^(\s)*$/) {
|
|
print do_var($var23);
|
|
$outfile=<STDIN>;
|
|
chomp $outfile;
|
|
}
|
|
|
|
print "Filename for full debug output: ";
|
|
$dbgoutfile=<STDIN>;
|
|
chomp $dbgoutfile;
|
|
while ($dbgoutfile =~ /^(\s)*$/) {
|
|
print do_var($var23);
|
|
$dbgoutfile=<STDIN>;
|
|
chomp $dbgoutfile;
|
|
}
|
|
|
|
$var31 = qq{
|
|
Since you will only be creating the formatted report, I will need a
|
|
temporary place to put the full output.
|
|
You may not enter "no file" for this.
|
|
Enter the filename for the temporary file:
|
|
};
|
|
if ($outfile ne "no file" and $dbgoutfile eq "no file") {
|
|
print do_var($var31);
|
|
$tmpoutfile=<STDIN>;
|
|
chomp $tmpoutfile;
|
|
while (($tmpoutfile =~ /^(\s)*$/) or ($tmpoutfile eq "no file")) {
|
|
print do_var($var23);
|
|
$tmpoutfile=<STDIN>;
|
|
chomp $tmpoutfile;
|
|
}
|
|
}
|
|
|
|
$whereis=`whereis wine`;
|
|
chomp $whereis;
|
|
print "\nWhere is your copy of Wine located?\n\n";
|
|
$whereis =~ s/^wine\: //;
|
|
@locations = split(/\s/,$whereis);
|
|
print "1 - Unlisted (I'll prompt you for a new location\n";
|
|
print "2 - Unsure (I'll use #3, that's probably it)\n";
|
|
$i=2;
|
|
foreach $location (@locations) {
|
|
$i++;
|
|
print "$i - $location\n";
|
|
}
|
|
print "\n";
|
|
sub select_wineloc {
|
|
do
|
|
{
|
|
print "Enter the number that corresponds to Wine's location: ";
|
|
$wineloc=<STDIN>;
|
|
chomp $wineloc;
|
|
}
|
|
while ( ! ( $wineloc >=1 and $wineloc <= 2+@locations ) );
|
|
if ($wineloc == 1) {
|
|
$var25 = qq{
|
|
Enter the full path to wine (Example: /usr/bin/wine):
|
|
};
|
|
$var26 = qq{
|
|
Please enter the full path to wine. A full path is the
|
|
directories leading up to a program's location, and then the
|
|
program. For example, if you had the program "wine" in the
|
|
directory "/usr/bin", you would type in "/usr/bin/wine". Now
|
|
try:
|
|
};
|
|
print do_var($var25) if $debuglevel == 3;
|
|
print do_var($var26) if $debuglevel < 3;
|
|
$wineloc=<STDIN>;
|
|
chomp $wineloc;
|
|
while ($wineloc =~ /^(\s)*$/) {
|
|
print do_var($var23);
|
|
$wineloc=<STDIN>;
|
|
chomp $wineloc;
|
|
}
|
|
}
|
|
elsif ($wineloc == 2) {
|
|
$wineloc=$locations[0];
|
|
}
|
|
else {
|
|
$wineloc=$locations[$wineloc-3];
|
|
}
|
|
}
|
|
&select_wineloc;
|
|
print "Checking if $wineloc is stripped...\n";
|
|
$ifstrip = `nm $wineloc 2>&1`;
|
|
while ($ifstrip =~ /no symbols/) {
|
|
$var24 = qq{
|
|
Your wine is stripped! You probably downloaded it off of the internet.
|
|
If you have another location of wine that may be used, enter it now.
|
|
Otherwise, hit control-c and download an unstripped version, then re-run
|
|
this script. Note: stripped versions make useless debug reports
|
|
};
|
|
print do_var($var24);
|
|
&select_wineloc;
|
|
$ifstrip = `nm $wineloc 2>&1`;
|
|
}
|
|
while ($ifstrip =~ /not recognized/) {
|
|
$var26 = qq{
|
|
Looks like you gave me something that isn't a wine binary (It could be a
|
|
text file). Try again.
|
|
};
|
|
print do_var($var26);
|
|
&select_wineloc;
|
|
print "Checking if $wineloc is stripped...\n";
|
|
$ifstrip = `nm $wineloc 2>&1`;
|
|
}
|
|
|
|
print "\nWhat version of windows are you using with wine?\n\n".
|
|
"0 - None\n".
|
|
"1 - Windows 3.x\n".
|
|
"2 - Windows 95\n".
|
|
"3 - Windows 98\n".
|
|
"4 - Windows NT 3.5x\n".
|
|
"5 - Windows NT4.x\n".
|
|
"6 - Windows 2000\n".
|
|
"7 - Other\n\n";
|
|
do
|
|
{
|
|
print "Enter the number that corresponds to your windows version: ";
|
|
$winver=<STDIN>;
|
|
chomp $winver;
|
|
}
|
|
until ($winver >= 0 and $winver <= 7);
|
|
if ($winver =~ 0) {
|
|
$winver="None Installed";
|
|
} elsif ($winver =~ 1) {
|
|
$winver="Windows 3.x";
|
|
} elsif ($winver =~ 2) {
|
|
$winver="Windows 95";
|
|
} elsif ($winver =~ 3) {
|
|
$winver="Windows 98";
|
|
} elsif ($winver =~ 4) {
|
|
$winver="Windows NT 3.5x";
|
|
} elsif ($winver =~ 5) {
|
|
$winver="Windows NT 4.x";
|
|
} elsif ($winver =~ 6) {
|
|
$winver="Windows NT 5.x";
|
|
} elsif ($winver =~ 7) {
|
|
print "What version of Windows are you using? ";
|
|
$winver=<STDIN>;
|
|
chomp $winver;
|
|
}
|
|
if ($debuglevel < 3) {
|
|
$var7 = qq{
|
|
Enter the full path to the program you want to run. Remember what you
|
|
were told before - a full path is the directories leading up to the
|
|
program and then the program's name, like /dos/windows/sol.exe, not
|
|
sol.exe:
|
|
};
|
|
print do_var($var7);
|
|
}
|
|
if ($debuglevel =~ 3) {
|
|
$var8 = qq{
|
|
Enter the full path to the program you want to run (Example:
|
|
/dos/windows/sol.exe, NOT sol.exe):
|
|
};
|
|
print do_var($var8);
|
|
}
|
|
$program=<STDIN>;
|
|
chomp $program;
|
|
while ($program =~ /^(\s)*$/) {
|
|
print do_var($var23);
|
|
$program=<STDIN>;
|
|
chomp $program;
|
|
}
|
|
$program =~ s/\"//g;
|
|
$var9 = qq{
|
|
Enter the name, version, and manufacturer of the program (Example:
|
|
Netscape Navigator 4.5):
|
|
};
|
|
print do_var($var9);
|
|
$progname=<STDIN>;
|
|
chomp $progname;
|
|
$var10 = qq{
|
|
Enter 0 if your program is 16 bit (Windows 3.x), 1 if your program is 32
|
|
bit (Windows 9x, NT3.x and up), or 2 if you are unsure:
|
|
};
|
|
print do_var($var10);
|
|
$progbits=<STDIN>;
|
|
chomp $progbits;
|
|
until ($progbits == 0 or $progbits == 1 or $progbits == 2) {
|
|
print "You must enter 0, 1 or 2!\n";
|
|
$progbits=<STDIN>;
|
|
chomp $progbits
|
|
}
|
|
if ($progbits =~ 0) {
|
|
$progbits=Win16
|
|
} elsif ($progbits =~ 1) {
|
|
$progbits=Win32
|
|
} else {
|
|
$progbits = "Unsure"
|
|
}
|
|
if ($debuglevel > 1) {
|
|
if ($debuglevel =~ 2) {
|
|
$var11 = qq{
|
|
Enter any extra debug options. Default is +relay - If you don't
|
|
know what options to use, just hit enter, and I'll use those (Example, the
|
|
developer tells you to re-run with -debugmsg +dosfs,+module you would type
|
|
in +dosfs,+module). Hit enter if you're not sure what to do:
|
|
};
|
|
print do_var($var11);
|
|
} elsif ($debuglevel =~ 3) {
|
|
$var12 = qq{
|
|
Enter any debug options you would like to use. Just enter parts after
|
|
-debugmsg. Default is +relay:
|
|
};
|
|
print do_var($var12);
|
|
}
|
|
$debugopts=<STDIN>;
|
|
chomp $debugopts;
|
|
if ($debugopts =~ /-debugmsg /) {
|
|
($crap, $debugopts) = split / /,$debugopts;
|
|
}
|
|
if ($debugopts =~ /^\s*$/) {
|
|
$debugopts="+relay";
|
|
}
|
|
} elsif ($debuglevel =~ 1) {
|
|
$debugopts = "+relay";
|
|
}
|
|
if ($debuglevel > 1) {
|
|
if ($debuglevel =~ 2) {
|
|
$var13 = qq{
|
|
How many trailing lines of debugging info do you want to include in the report
|
|
you're going to submit (First file)? If a developer asks you to include
|
|
the last 1000 lines, enter 1000 here. Default is 200, which is reached by
|
|
pressing enter. (If you're not sure, just hit enter):
|
|
};
|
|
print do_var($var13);
|
|
} elsif ($debuglevel =~ 3) {
|
|
$var14 = qq{
|
|
Enter how many lines of trailing debugging output you want in your nice
|
|
formatted report. Default is 200:
|
|
};
|
|
print do_var($var14);
|
|
}
|
|
$lastnlines=<STDIN>;
|
|
chomp $lastnlines;
|
|
if ($lastnlines =~ /^\s*$/) {
|
|
$lastnlines=200;
|
|
}
|
|
} elsif ($debuglevel =~ 1) {
|
|
$lastnlines=200;
|
|
}
|
|
if ($debuglevel > 1) {
|
|
$var15 = qq{
|
|
Enter any extra options you want to pass to WINE. Strongly recommended you
|
|
include -managed:
|
|
};
|
|
print do_var($var15);
|
|
$extraops=<STDIN>;
|
|
chomp $extraops;
|
|
} elsif ($debuglevel =~ 1) {
|
|
$extraops="-managed";
|
|
}
|
|
|
|
print "\nEnter the name of your distribution (Example: Redhat 6.1): ";
|
|
$dist=<STDIN>;
|
|
chomp $dist;
|
|
|
|
if ($debuglevel > 1) {
|
|
if ($debuglevel =~ 2) {
|
|
$var16 = qq{
|
|
When you ran ./configure to build wine, were there any special options
|
|
you used to do so (Example: --enable-dll)? If you didn't use any special
|
|
options or didn't compile WINE on your own, just hit enter:
|
|
};
|
|
print do_var($var16);
|
|
} elsif ($debuglevel =~ 3) {
|
|
$var17 = qq{
|
|
Enter any special options you used when running ./configure for WINE
|
|
(Default is none, use if you didn't compile wine yourself):
|
|
};
|
|
print do_var($var17);
|
|
}
|
|
$configopts=<STDIN>;
|
|
chomp $configopts;
|
|
if ($configopts =~ /^\s*$/) {
|
|
$configopts="None";
|
|
}
|
|
} elsif ($debuglevel =~ 1) {
|
|
$configopts="None";
|
|
}
|
|
if ($debuglevel > 1) {
|
|
if ($debuglevel =~ 2) {
|
|
$var18 = qq{
|
|
Is your wine version CVS or from a .tar.gz file? As in... did you download it
|
|
off a website/ftpsite or did you/have you run cvs on it to update it?
|
|
For CVS: YYMMDD, where YY is the year (99), MM is the month (01), and DD
|
|
is the day (14), that you last updated it (Example: 990114).
|
|
For tar.gz: Just hit enter and I'll figure out the version for you:
|
|
};
|
|
print do_var($var18);
|
|
} elsif ($debuglevel =~ 3) {
|
|
$var19 = qq{
|
|
Is your wine from CVS? Enter the last CVS update date for it here, in
|
|
YYMMDD form (If it's from a tarball, just hit enter):
|
|
};
|
|
print do_var($var19);
|
|
}
|
|
$winever=<STDIN>;
|
|
chomp $winever;
|
|
if ($winever =~ /[0-9]+/) {
|
|
$winever .= " CVS";
|
|
}
|
|
else {
|
|
$winever = `$wineloc -v 2>&1`;
|
|
chomp $winever;
|
|
}
|
|
} elsif ($debuglevel =~ 1) {
|
|
$winever=`$wineloc -v 2>&1`;
|
|
chomp $winever;
|
|
}
|
|
$gccver=`gcc -v 2>&1`;
|
|
($leftover,$gccver) = split /\n/,$gccver;
|
|
chomp $gccver;
|
|
$cpu=`uname -m`;
|
|
chomp $cpu;
|
|
$kernelver=`uname -r`;
|
|
chomp $kernelver;
|
|
$ostype=`uname -s`;
|
|
chomp $ostype;
|
|
$wineneeds=`ldd $wineloc`;
|
|
if ($debuglevel < 3) {
|
|
$var20 = qq{
|
|
OK, now I'm going to run WINE. I will close it for you once the wine
|
|
debugger comes up. NOTE: You won't see ANY debug messages. Don't
|
|
worry, they are being output to a file. Since there are so many, it's
|
|
not a good idea to have them all output to a terminal (Speed slowdown
|
|
mainly).
|
|
WINE will still run much slower than normal, because there will be so
|
|
many debug messages being output to file.
|
|
};
|
|
print do_var($var20);
|
|
} elsif ($debuglevel =~ 3) {
|
|
$var21 = qq{
|
|
OK, now it's time to run WINE. I will close down WINE for you after
|
|
the debugger is finished doing its thing.
|
|
};
|
|
print do_var($var21);
|
|
}
|
|
$bashver=qw("/bin/bash -version");
|
|
if ($bashver =~ /2\./) { $outflags = "2>" }
|
|
else { $outflags = ">\&" }
|
|
print "Hit enter to start wine!\n";
|
|
$blank=<STDIN>;
|
|
$dir=$program;
|
|
$dir=~m#(.*)/#;
|
|
$dir=$1;
|
|
use Cwd;
|
|
$nowdir=getcwd;
|
|
chdir($dir);
|
|
if (!($outfile =~ /\//) and $outfile ne "no file") {
|
|
$outfile = "$nowdir/$outfile";
|
|
}
|
|
if (!($dbgoutfile =~ /\//) and $dbgoutfile ne "no file") {
|
|
$dbgoutfile = "$nowdir/$dbgoutfile";
|
|
}
|
|
if (!($tmpoutfile =~ /\//)) {
|
|
$tmpoutfile = "$nowdir/$tmpoutfile";
|
|
}
|
|
$SIG{CHLD}=$SIG{CLD}=sub { wait };
|
|
if ($dbgoutfile ne "no file") {
|
|
unlink("$dbgoutfile");
|
|
if ($pid=fork()) {
|
|
}
|
|
elsif (defined $pid) {
|
|
close(0);close(1);close(2);
|
|
exec "echo quit | $wineloc -debugmsg $debugopts $extraops \"$program\" > $dbgoutfile 2>&1";
|
|
}
|
|
else {
|
|
die "couldn't fork";
|
|
}
|
|
while (kill(0, $pid)) {
|
|
sleep(5);
|
|
$last = `tail -n 5 $dbgoutfile | grep Wine-dbg`;
|
|
if ($last =~ /Wine-dbg/) {
|
|
kill "TERM", $pid;
|
|
break;
|
|
}
|
|
}
|
|
if ($outfile ne "no file") {
|
|
$lastlines=`tail -n $lastnlines $dbgoutfile`;
|
|
system("gzip $dbgoutfile");
|
|
&generate_outfile;
|
|
}
|
|
else {
|
|
system("gzip $dbgoutfile");
|
|
}
|
|
}
|
|
elsif ($outfile ne "no file" and $dbgoutfile eq "no file") {
|
|
if ($pid=fork()) {
|
|
}
|
|
elsif (defined $pid) {
|
|
close(0);close(1);close(2);
|
|
exec "echo quit | $wineloc -debugmsg $debugopts $extraops \"$program\" 2>&1| tee $tmpoutfile | tail -n $lastnlines > $outfile";
|
|
}
|
|
else {
|
|
die "couldn't fork";
|
|
}
|
|
print "$outfile $tmpoutfile";
|
|
while (kill(0, $pid)) {
|
|
sleep(5);
|
|
$last = `tail -n 5 $tmpoutfile | grep Wine-dbg`;
|
|
if ($last =~ /Wine-dbg/) {
|
|
kill "TERM", $pid;
|
|
break;
|
|
}
|
|
}
|
|
unlink($tmpoutfile);
|
|
open(OUTFILE, "$outfile");
|
|
while (<OUTFILE>) {
|
|
$lastlines .= $_;
|
|
}
|
|
close(OUTFILE);
|
|
unlink($outfile);
|
|
&generate_outfile;
|
|
}
|
|
else {
|
|
$var27 = qq{
|
|
I guess you don't want me to make any debugging output. I'll send
|
|
it to your terminal. This will be a *lot* of output -- hit enter to
|
|
continue, control-c to quit.
|
|
Repeat: this will be a lot of output!
|
|
};
|
|
print do_var($var27);
|
|
$blah=<STDIN>;
|
|
system("$wineloc -debugmsg $debugmsg $extraops \"$program\"");
|
|
}
|
|
sub generate_outfile {
|
|
open(OUTFILE,">$outfile");
|
|
print OUTFILE <<EOM;
|
|
Auto-generated debug report by Wine Quick Debug Report Maker Thingy:
|
|
WINE Version: $winever
|
|
Windows Version: $winver
|
|
Distribution: $dist
|
|
Kernel Version: $kernelver
|
|
OS Type: $ostype
|
|
CPU: $cpu
|
|
GCC Version: $gccver
|
|
Program: $progname
|
|
Program Type: $progbits
|
|
Debug Options: -debugmsg $debugopts
|
|
Other Extra Commands Passed: $extraops
|
|
Extra ./configure Commands: $configopts
|
|
Wine Dependencies:
|
|
$wineneeds
|
|
Last $lastnlines lines of debug output follows:
|
|
$lastlines
|
|
I have a copy of the full debug report, if it is needed.
|
|
Thank you!
|
|
EOM
|
|
}
|
|
$var22 = qq{
|
|
Great! We're finished making the debug report. Do whatever with it.
|
|
};
|
|
$var28 = qq{
|
|
The filename for the formatted report is:
|
|
$outfile
|
|
};
|
|
$var29 = qq{
|
|
The filename for the compressed full debug is:
|
|
$dbgoutfile.gz
|
|
Note that it is $dbgoutfile.gz, since I compressed it with gzip for you.
|
|
};
|
|
$var30 = qq{
|
|
Having problems with the script? Tell the wine newsgroup
|
|
(comp.emulators.ms-windows.wine).
|
|
};
|
|
print do_var($var22);
|
|
print do_var($var28) if $outfile ne "no file";
|
|
print do_var($var29) if $dbgoutfile ne "no file";
|
|
print do_var($var30);
|
|
|