mirror of
https://github.com/reactos/wine.git
synced 2025-02-23 22:40:55 +00:00

Sun Jun 15 10:30:35 1998 Andreas Mohr <100.30936@germany.net> * [files/dos_fs.c] [files/file.c] [if1632/wprocs.spec] [misc/aspi.c] Added support for scanners that need Adaptec's ASPI2DOS. * [graphics/env.c] [misc/printerdrv.c] [graphics/win16drv/init.c] [if1632/gdi.spec] [include/gdi.h] Enhanced printer support (especially Win95): Drv[GS]etPrinterData, [GS]etEnvironment; added AbortProc handling. * [misc/tapi32.c] [relay32/tapi32.spec] Added some stubs. * [configure.in] [graphics/fontengine.c] [include/windows.h] [misc/comm.c] [misc/w32skrnl.c] [misc/win32s16.c] Made Wine compile on HP-UX (just for fun ;) * [controls/menu.c] [include/windows.h] Complete rewrite of EnableMenuItem32. Free Agent 32 still doesn't work :( * [misc/version.c] [if1632/kernel.spec] [include/winbase.h] Implemented GetVersionEx16. * [misc/network.c] [if1632/user.spec] Fixed arguments of WNetGetPropertyText. * [misc/version.c] [relay32/comctl32.spec] [relay32/oleaut32.spec] Implemented COMCTL32_DllGetVersion, OaBuildVersion. * [win32/file.c] Fixed UNC handling of CreateFile32. Sat Jun 13 22:35:12 1998 Douglas Ridgway <ridgway@winehq.com> * [Makefile.in] [Make.rules.in] Added pattern for CVS merge files to 'make clean' * [ole/olecli.c] [windows/scroll.c] [windows/grahics.c] Add some DC handle unlocking. (When hdc's are always unlocked, they can be made moveable.) * [documentation/wine.texinfo] Started a Wine Design chapter with discussion of graphics driver model. Sat Jun 13 11:19:25 1998 David Luyer <luyer@ucs.uwa.edu.au> * [misc/main.c] [relay32/relay386.c] Added new option -debugmsg +relay=.... or -debugmsg -relay=... Fri Jun 12 22:56:09 1998 Marcus Meissner <marcus@jet.franken.de> * [relay32/snoop.c][relay32/builtin.c][loader/pe_image.c] Added inter win32 dll snooping. Use -debugmsg +snoop. Number of arguments and string references are autodetected. Some small bugfixes in the PE loader. * [misc/system.c] Disabled SystemTimers. They do not work with the current %fs handling in the 32->16 relaycode. (helps labview) * [msdos/dpmi.c][msdos/int2f.c][files/drive.c] Added a monoton linear increasing memory allocator for DPMI (required for LabView, HAFAS, ...) mscdex handling in emulated realmode interrupts (for mcicda.drv) allocate logical drives only once. (helps Myst) * [files/profile.c] Handle ^Z as space. Found on CDROMS (helps Myst Installer). * [multimedia/mmio.c] mmio* partially updated to win32. No funny additions. * [windows/driver.c] Added win32 driver handling (will be used for win32 multimedia/ msvideo drivers). * [win32/device.c] Added device handling (K32OBJ_DEVICE_IOCTL). Implemented VTDAPI.5 (used by win95' WINMM.timeGetTime()) Fri Jun 12 18:01:18 1998 Rein Klazes <rklazes@casema.net> * [ole/compobj.c relay32/ole32.spec] Add a stub for CoLockObjectExternal32. * [objects/clipping.c] Fix in IntersectClipRect(), when there is no initial clipping region. * [graphics/x11drv/graphics.c] Corrected several "one-off" errors for the Ellipse, Rectangle and RoundRectangle (especially small ones) draw routines. Arc and friends still have to be done. Fri Jun 12 06:23:19 1998 Matthew Becker <mbecker@glasscity.net> * [misc/ntdll.c] Fixed some of the parameter counts. * [misc/registry.c] General cleanup, documentation. Standard keys are allowed to be 'closed' and succeed. * [misc/shell.c] Check for correct return values from Reg* functions. * [win32/newfns.c] Added stubs for OpenDesktopA, SetThreadDesktop, and SetUserObjectInformationA. Wed Jun 10 20:28:08 1998 James Juran <jrj120@psu.edu> * [debugger/break.c] Fixed bug introduced in 980503 that broke the -debug command line option for PE executable files. * [configure.in] [include/acconfig.h] [include/debugtools.h] [documentation/debug-msgs] Added 'configure' options to compile out debugging messages. Use --disable-debug to disable all debugging messages, and --disable-trace to just disable TRACE messages. This results in a stripped executable that is 15-20% smaller. This option is very much untested--don't expect it to work. * [documentation/debug-msgs] [documentation/debugging] Minor updates. * [*/*.c] Fixed some compile warnings. This also includes the compile_warnings_trivial patch from WineHQ. Tue Jun 10 22:00:18 1998 Eric Kohl <ekohl@abo.rhein-zeitung.de> * [windows/sysmetrics.c][include/sysmetrics.h] Fixed some Win95 values. * [windows/nonclient.c][include/windows.h] Fixed some Win95 drawing bugs. Added extended window style flags (WS_EX_xxx). * [misc/printdrv.c][relay32/winspool.spec] Added stubs for DeletePrinterDriver32A, DeleteMonitor32A and DeletePort32A. * [windows/mdi.c][include/windows.h][relay32/user32.spec] Added stubs for CascadeWindows and TileWindows. * [controls/toolbar.c][include/toolbar.h] Fixed a few bugs and implemented new features. * [misc/shellord.c][relay32/shell32.spec] Added stubs for SHELL32_60, SHELL32_61 and SHELL32_184. * [controls/comctl32undoc.c][relay32/comctl32.spec] New file comctl32undoc.c. Contains undocumented functions of COMCTL32.DLL. These functions are needed to run EXPLORER.EXE IEXPLORE.EXE and TASKMAN.EXE. * [controls/status.c] Added text alignment. Tue Jun 8 22:00:00 1998 Bertho Stultiens <bertho@akhphd.au.dk> * [programs/*/Makefile.in] Changed the rules to use wrc as resource compiler but passing the source through gcc first for macro expansion. * [programs/*/*.rc] Added #include "windows.h" for the resource compiler in the appropriate files. * [tools/wrc/wrc.[ch]] [tools/wrc/writeres.c] Added commandline option -A for autoregister code. Corrected the underscore problem by checking the proper define from config.h. Sun Jun 7 22:09:29 1998 Pascal Cuoq <pcuoq@ens-lyon.fr> * [ole/ole2nls.c] [memory/string.c] Improved LCMapString32A, and changed CompareString32A, lstrcmp, lstrcmpi to use it. Sat Jun 6 19:00:50 1998 Martin Strömberg <ams@ludd.luth.se> * [include/winnt.h] Added typedefs for security and tokens. Sat Jun 6 12:26:31 1998 Morten Welinder <terra@diku.dk> * [objects/text.c] Use debugstr_an in DrawText16. * [loader/resource.c] Use debugres_w in FindResourceEx32W. Avoid crashing during debug when wm is NULL. * [if1632/relay.c] In RELAY_DebugCallTo16, send output to the right place and avoid side effects in macro arguments. Wed Jun 3 20:56:03 1998 Huw D M Davies <daviesh@abacus.physics.ox.ac.uk> * [controls/scroll.c] [windows/nonclient.c] Fix several off by one errors in scrollbar painting. Tue Jun 2 23:58:59 1998 Insomnia (Stea Greene) <insomnia@core.binghamton.edu> * [graphics/dsound.c] Rewrote mixer code to handle panning and volume for 16->16, 16->8, 8->16, and 8->8 bit mixes. Conforms to DirectX's "logarithmic hearing scale" as specified in M$VC docs. Still does not handle mixing of different frequencies (I am still working on that). Tested 16->16 extensively with StarCraft. Other mixing combinations untested but should work fine. Still kind of a work in progress, so be warned. Tue Jun 2 03:31:33 1998 Alexander V. Lukyanov <lav@long.yar.ru> * [tools/wrc/utils.c] dup_basename: fix to strip directory. Mon Jun 1 20:00:00 1998 Juergen Schmied <juergen.schmied@metronet.de> * [include/windows.h] [objects/cursoricon.c] [relay32/user32.spec] Added stubs LoadCursorFromFileW and LoadCursorFromFileA.
260 lines
12 KiB
Plaintext
260 lines
12 KiB
Plaintext
This file describes where to start debugging Wine and how to write
|
||
useful bug reports.
|
||
|
||
Crashes
|
||
=======
|
||
|
||
These usually show up like this:
|
||
|
||
|Unexpected Windows program segfault - opcode = 8b
|
||
|Segmentation fault in Windows program 1b7:c41.
|
||
|Loading symbols from ELF file /root/wine/wine...
|
||
|....more Loading symbols from ...
|
||
|In 16 bit mode.
|
||
|Register dump:
|
||
| CS:01b7 SS:016f DS:0287 ES:0000
|
||
| IP:0c41 SP:878a BP:8796 FLAGS:0246
|
||
| AX:811e BX:0000 CX:0000 DX:0000 SI:0001 DI:ffff
|
||
|Stack dump:
|
||
|0x016f:0x878a: 0001 016f ffed 0000 0000 0287 890b 1e5b
|
||
|0x016f:0x879a: 01b7 0001 000d 1050 08b7 016f 0001 000d
|
||
|0x016f:0x87aa: 000a 0003 0004 0000 0007 0007 0190 0000
|
||
|0x016f:0x87ba:
|
||
|
|
||
|0050: sel=0287 base=40211d30 limit=0b93f (bytes) 16-bit rw-
|
||
|Backtrace:
|
||
|0 0x01b7:0x0c41 (PXSRV_FONGETFACENAME+0x7c)
|
||
|1 0x01b7:0x1e5b (PXSRV_FONPUTCATFONT+0x2cd)
|
||
|2 0x01a7:0x05aa
|
||
|3 0x01b7:0x0768 (PXSRV_FONINITFONTS+0x81)
|
||
|4 0x014f:0x03ed (PDOXWIN_@SQLCURCB$Q6CBTYPEULN8CBSCTYPE+0x1b1)
|
||
|5 0x013f:0x00ac
|
||
|
|
||
|0x01b7:0x0c41 (PXSRV_FONGETFACENAME+0x7c): movw %es:0x38(%bx),%dx
|
||
|
||
Steps to debug a crash. You may stop at any step, but please report the bug
|
||
and provide as much of the information gathered to the newsgroup or the
|
||
relevant developer as feasonable.
|
||
|
||
1. Get the reason for the crash. This is usually an access to an invalid
|
||
selector, an access to an out of range address in a valid selector,
|
||
popping a segmentregister from the stack or the like. When reporting a
|
||
crash, report this WHOLE crashdump even if it doesn't make sense to you.
|
||
|
||
(In this case it is access to an invalid selector, for %es is 0000, as
|
||
seen in the register dump).
|
||
|
||
2. Determine where the reason came from.
|
||
Since this is usually a primary/secondary reaction to a failed or
|
||
misbehaving Wine function, rerun Wine with "-debugmsg +relay" (without ")
|
||
added to the commandline. This will get rather much output, but usually
|
||
the reason is located in the last call(s). Those lines usually look like
|
||
this:
|
||
|
||
|Call KERNEL.90: LSTRLEN(0227:0692 "text") ret=01e7:2ce7 ds=0227
|
||
^^^^^^^^^ ^ ^^^^^^^^^ ^^^^^^ ^^^^^^^^^ ^^^^
|
||
| | | | | |Datasegment
|
||
| | | | |Return address
|
||
| | | |textual parameter
|
||
| | |
|
||
| | |Argument(s). This one is a win16 segmented pointer.
|
||
| |Function called.
|
||
|The module, the function is called in. In this case it is KERNEL.
|
||
|
||
|Ret KERNEL.90: LSTRLEN() retval=0x0004 ret=01e7:2ce7 ds=0227
|
||
^^^^^^
|
||
|Returnvalue is 16 bit and has the value 4.
|
||
|
||
|
||
3. If you have found a misbehaving function, try to find out why it
|
||
misbehaves. Find the function in the source code. Try to make sense of
|
||
the arguments passed. Usually there is a 'TRACE(<channel>,"(...)\n");'
|
||
at the beginning of the function. Rerun wine with
|
||
"-debugmsg +xyz,+relay" added to the commandline.
|
||
|
||
4. Additional information on how to debug using the internal debugger can be
|
||
found in debugger/README.
|
||
|
||
5. If those information isn't clear enough or if you want to know more about
|
||
what's happening in the function itself, try running wine with "-debugmsg
|
||
+all", which dumps ALL included debug information in wine.
|
||
|
||
6. If that isn't enough add more debug output for yourself into the
|
||
functions you find relevant. See documentation/debug-msgs.
|
||
You might also try to run the program in gdb instead of using the
|
||
WINE-debugger. If you don't use the "-desktop" or "-managed" option,
|
||
start the WINE process with "-sync", or chances are good to get X into
|
||
an unusable state.
|
||
|
||
7. You can also set a breakpoint for that function. Start wine with the
|
||
"-debug" option added to the commandline. After loading the executable
|
||
wine will enter the internal debugger. Use "break KERNEL_LSTRLEN"
|
||
(replace by function you want to debug, CASE IS RELEVANT.) to set a
|
||
breakpoint. Then use "continue" to start normal program-execution. Wine
|
||
will stop if it reaches the breakpoint. If the program isn't yet at the
|
||
crashing call of that function, use "continue" again until you are about
|
||
to enter that function. You may now proceed with single-stepping the
|
||
function until you reach the point of crash. Use the other debugger
|
||
commands to print registers and the like.
|
||
|
||
|
||
Program hangs, nothing happens
|
||
==============================
|
||
|
||
Switch to UNIX shell, get the process-ID using "ps -a|grep wine", and do a
|
||
"kill -HUP <pid>" (without " and <>). Wine will then enter its internal
|
||
debugger and you can proceed as explained above. Also, you can use -debug
|
||
switch and then you can get into internal debugger by pressing Ctrl-C in
|
||
the terminal where you run Wine.
|
||
|
||
Program reports an error with a Messagebox
|
||
==========================================
|
||
|
||
Sometimes programs are reporting failure using a more or less nondescript
|
||
messageboxes. We can debug this using the same method as Crashes, but there
|
||
is one problem... For setting up a message box the program also calls Wine
|
||
producing huge chunks of debug code.
|
||
|
||
Since the failure happens usually directly before setting up the Messagebox
|
||
you can start wine with "-debug" added to the commandline, set a breakpoint
|
||
at "MessageBox32A" (called by win16 and win32 programs) and proceed with
|
||
"continue". With "-debugmsg +all" Wine will now stop directly before
|
||
setting up the Messagebox. Proceed as explained above.
|
||
|
||
You can also run wine using "wine -debugmsg +relay program.exe 2>&1|less -i"
|
||
and in less search for messagebox.
|
||
|
||
Disassembling programs:
|
||
=======================
|
||
You may also try to disassemble the offending program to check for
|
||
undocumented features and/or use of them.
|
||
|
||
The best, freely available, disassembler for Win16 programs is
|
||
Windows Codeback, archivename wcbxxx.zip, which usually can be found
|
||
in the Cica-Mirror subdirectory on the WINE ftpsites. (See ANNOUNCE).
|
||
Disassembling win32 programs is possible using the Windows Disassembler 32,
|
||
archivename something like w32dasm.zip on ftp.winsite.com and mirrors.
|
||
The shareware version does not allow saving of disassembly listings.
|
||
|
||
[It also has a bug, it disassembles the dll and immediately after that
|
||
crashes, leaving a very large file caled 'winsys' in the directory of the
|
||
disassembled file. This file contains nothing of value (just the disassembly)
|
||
and can be safely deleted.]
|
||
|
||
Understanding disassembled code is just a question of exercise.
|
||
|
||
Most code out there uses standard C function entries (for it is usually
|
||
written in C). Win16 function entries usually look like that:
|
||
| push bp
|
||
| mov bp, sp
|
||
| ... function code ..
|
||
| retf XXXX <--------- XXXX is number of bytes of arguments
|
||
|
||
This is a FAR function with no local storage. The arguments usually start
|
||
at [bp+6] with increasing offsets. Note, that [bp+6] belongs to the RIGHTMOST
|
||
argument, for exported win16 functions use the PASCAL calling convention.
|
||
So, if we use strcmp(a,b) with a and b both 32 bit variables b would be at
|
||
[bp+6] and a at [bp+10].
|
||
Most functions make also use of local storage in the stackframe:
|
||
| enter 0086, 00
|
||
| ... function code ...
|
||
| leave
|
||
| retf XXXX
|
||
This does mostly the same as above, but also adds 0x86 bytes of
|
||
stackstorage, which is accessed using [bp-xx].
|
||
Before calling a function, arguments are pushed on the stack using something
|
||
like this:
|
||
| push word ptr [bp-02] <- will be at [bp+8]
|
||
| push di <- will be at [bp+6]
|
||
| call KERNEL.LSTRLEN
|
||
Here first the selector and then the offset to the passed string are pushed.
|
||
|
||
Sample debugging session:
|
||
=========================
|
||
|
||
Let's debug the infamous Word SHARE.EXE messagebox:
|
||
|
||
|marcus@jet $ wine winword.exe
|
||
| +---------------------------------------------+
|
||
| | ! You must leave Windows and load SHARE.EXE|
|
||
| | before starting Word. |
|
||
| +---------------------------------------------+
|
||
|
||
|
||
|marcus@jet $ wine winword.exe -debugmsg +relay -debug
|
||
|CallTo32(wndproc=0x40065bc0,hwnd=000001ac,msg=00000081,wp=00000000,lp=00000000)
|
||
|Win16 task 'winword': Breakpoint 1 at 0x01d7:0x001a
|
||
|CallTo16(func=0127:0070,ds=0927)
|
||
|Call WPROCS.24: TASK_RESCHEDULE() ret=00b7:1456 ds=0927
|
||
|Ret WPROCS.24: TASK_RESCHEDULE() retval=0x8672 ret=00b7:1456 ds=0927
|
||
|CallTo16(func=01d7:001a,ds=0927)
|
||
| AX=0000 BX=3cb4 CX=1f40 DX=0000 SI=0000 DI=0927 BP=0000 ES=11f7
|
||
|Loading symbols: /home/marcus/wine/wine...
|
||
|Stopped on breakpoint 1 at 0x01d7:0x001a
|
||
|In 16 bit mode.
|
||
|Wine-dbg>break MessageBox32A <---- Set Breakpoint
|
||
|Breakpoint 2 at 0x40189100 (MessageBox32A [msgbox.c:190])
|
||
|Wine-dbg>c <---- Continue
|
||
|Call KERNEL.91: INITTASK() ret=0157:0022 ds=08a7
|
||
| AX=0000 BX=3cb4 CX=1f40 DX=0000 SI=0000 DI=08a7 ES=11d7 EFL=00000286
|
||
|CallTo16(func=090f:085c,ds=0dcf,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0dcf)
|
||
|... <----- Much debugoutput
|
||
|Call KERNEL.136: GETDRIVETYPE(0x0000) ret=060f:097b ds=0927
|
||
^^^^^^ Drive 0 (A:)
|
||
|Ret KERNEL.136: GETDRIVETYPE() retval=0x0002 ret=060f:097b ds=0927
|
||
^^^^^^ DRIVE_REMOVEABLE
|
||
(It is a floppy diskdrive.)
|
||
|
||
|Call KERNEL.136: GETDRIVETYPE(0x0001) ret=060f:097b ds=0927
|
||
^^^^^^ Drive 1 (B:)
|
||
|Ret KERNEL.136: GETDRIVETYPE() retval=0x0000 ret=060f:097b ds=0927
|
||
^^^^^^ DRIVE_CANNOTDETERMINE
|
||
(I don't have drive B: assigned)
|
||
|
||
|Call KERNEL.136: GETDRIVETYPE(0x0002) ret=060f:097b ds=0927
|
||
^^^^^^^ Drive 2 (C:)
|
||
|Ret KERNEL.136: GETDRIVETYPE() retval=0x0003 ret=060f:097b ds=0927
|
||
^^^^^^ DRIVE_FIXED
|
||
(specified as a harddisk)
|
||
|
||
|Call KERNEL.97: GETTEMPFILENAME(0x00c3,0x09278364"doc",0x0000,0927:8248) ret=060f:09b1 ds=0927
|
||
^^^^^^ ^^^^^ ^^^^^^^^^
|
||
| | |buffer for fname
|
||
| |temporary name ~docXXXX.tmp
|
||
|Force use of Drive C:.
|
||
|
||
|Warning: GetTempFileName returns 'C:~doc9281.tmp', which doesn't seem to be writeable.
|
||
|Please check your configuration file if this generates a failure.
|
||
|
||
Whoops, it even detects that something is wrong!
|
||
|
||
|Ret KERNEL.97: GETTEMPFILENAME() retval=0x9281 ret=060f:09b1 ds=0927
|
||
^^^^^^ Temporary storage ID
|
||
|
||
|Call KERNEL.74: OPENFILE(0x09278248"C:~doc9281.tmp",0927:82da,0x1012) ret=060f:09d8 ds=0927
|
||
^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^
|
||
|filename |OFSTRUCT |open mode:
|
||
|
||
OF_CREATE|OF_SHARE_EXCLUSIVE|OF_READWRITE
|
||
|
||
This fails, since my C: drive is in this case mounted readonly.
|
||
|
||
|Ret KERNEL.74: OPENFILE() retval=0xffff ret=060f:09d8 ds=0927
|
||
^^^^^^ HFILE_ERROR16, yes, it failed.
|
||
|
||
|Call USER.1: MESSAGEBOX(0x0000,0x09278376"Sie m<>ssen Windows verlassen und SHARE.EXE laden bevor Sie Word starten.",0x00000000,0x1030) ret=060f:084f ds=0927
|
||
|
||
And MessageBox'ed.
|
||
|
||
|Stopped on breakpoint 2 at 0x40189100 (MessageBox32A [msgbox.c:190])
|
||
|190 { <- the sourceline
|
||
In 32 bit mode.
|
||
Wine-dbg>
|
||
|
||
The code seems to find a writeable harddisk and tries to create a file
|
||
there. To work around this bug, you can define C: as a networkdrive,
|
||
which is ignored by the code above.
|
||
|
||
Written by Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>,
|
||
additions welcome.
|