Extended bt command to display backtrace of another thread.
[wine] / documentation / debugger.sgml
1   <chapter id="debugger">
2     <title>Debugging Wine</title>
3
4     <sect1 id="dbg-intro">
5       <title>Introduction</title>
6
7       <para>
8         Written by &name-eric-pouech; <email>&email-eric-pouech;</email>
9         (Last updated: 6/14/2000)
10       </para>
11       <para>
12         (Extracted from <filename>wine/documentation/winedbg</filename>)
13       </para>
14
15       <sect2>
16         <title>Processes and threads: in underlying OS and in Windows</title>
17
18         <para>
19           Before going into the depths of debugging in Wine, here's
20           a small overview of process and thread handling in Wine.
21           It has to be clear that there are two different beasts:
22           processes/threads from the Unix point of view and
23           processes/threads from a Windows point of view.
24         </para>
25         <para>
26           Each Windows' thread is implemented as a Unix process (under
27           Linux using the <function>clone</function> syscall), meaning
28           that all threads of a same Windows' process share the same
29           (unix) address space.
30         </para>
31         <para>
32           In the following:
33         </para>
34         <itemizedlist>
35           <listitem>
36             <para><varname>W-process</varname> means a process in Windows' terminology</para>
37           </listitem>
38           <listitem>
39             <para><varname>U-process</varname> means a process in Unix' terminology</para>
40           </listitem>
41           <listitem>
42             <para><varname>W-thread</varname> means a thread in Windows' terminology</para>
43           </listitem>
44         </itemizedlist>
45         <para>
46           A <varname>W-process</varname> is made of one or several
47           <varname>W-threads</varname>. Each
48           <varname>W-thread</varname> is mapped to one and only one
49           <varname>U-process</varname>. All
50           <varname>U-processes</varname> of a same
51           <varname>W-process</varname> share the same address space.
52         </para>
53         <para>
54           Each Unix process can be identified by two values:
55         </para>
56         <itemizedlist>
57           <listitem>
58             <para>the Unix process id (<varname>upid</varname> in the following)</para>
59           </listitem>
60           <listitem>
61             <para>the Windows's thread id (<varname>tid</varname>)</para>
62           </listitem>
63         </itemizedlist>
64         <para>
65           Each Windows' process has also a Windows' process id
66           (<varname>wpid</varname> in the following). It must be clear
67           that <varname>upid</varname> and <varname>wpid</varname> are
68           different and shall not be used instead of the other.
69         </para>
70         <para>
71           <varname>Wpid</varname> and <varname>tid</varname> are
72           defined (Windows) system wide. They must not be confused
73           with process or thread handles which, as any handle, is an
74           indirection to a system object (in this case process or
75           thread). A same process can have several different handles
76           on the same kernel object. The handles can be defined as
77           local (the values is only valid in a process), or system
78           wide (the same handle can be used by any
79           <varname>W-process</varname>).
80         </para>
81       </sect2>
82
83       <sect2>
84         <title>Wine, debugging and WineDbg</title>
85
86         <para>
87           When talking of debugging in Wine, there are at least two
88           levels to think of:
89         </para>
90         <itemizedlist>
91           <listitem>
92             <para>the Windows' debugging API.</para>
93           </listitem>
94           <listitem>
95             <para>the Wine integrated debugger, dubbed
96               <command>WineDbg</command>.</para>
97           </listitem>
98         </itemizedlist>
99         <para>
100           Wine implements most of the Windows' debugging API (the
101           part in KERNEL32, not the one in
102           <filename>IMAGEHLP.DLL</filename>), and allows any program
103           (emulated or Winelib) using that API to debug a
104           <varname>W-process</varname>.
105         </para>
106         <para>
107           <command>WineDbg</command> is a Winelib application making
108           use of this API to allow debugging both any Wine or Winelib
109           applications as well as Wine itself (kernel and all DLLs).
110         </para>
111       </sect2>
112     </sect1>
113
114
115     <sect1 id="dbg-modes">
116       <title>WineDbg's modes of invocation</title>
117
118       <sect2>
119         <title>Starting a process</title>
120
121         <para>
122           Any application (either a Windows' native executable, or a
123           Winelib application) can be run through
124           <command>WineDbg</command>. Command line options and tricks
125           are the same as for wine:
126         </para>
127         <screen>
128 winedbg telnet.exe
129 winedbg "hl.exe -windowed"
130         </screen>
131       </sect2>
132
133       <sect2>
134         <title>Attaching</title>
135
136         <para>
137           <command>WineDbg</command> can also be launched without any
138           command line argument: <command>WineDbg</command> is started
139           without any attached process. You can get a list of running
140           <varname>W-processes</varname> (and their
141           <varname>wpid</varname>'s) using the <command>walk
142             process</command> command, and then, with the
143           <command>attach</command> command, pick up the
144           <varname>wpid</varname> of the <varname>W-process</varname>
145           you want to debug. This is (for now) a neat feature for the
146           following reasons: 
147         </para>
148         <itemizedlist>
149           <listitem>
150             <para>you can debug an already started application</para>
151           </listitem>
152         </itemizedlist>
153       </sect2>
154
155       <sect2 id="dbg-on-exception">
156         <title id="dbg-exception-title">On exception</title>
157
158         <para>
159           When something goes wrong, Windows tracks this as an
160           exception. Exceptions exist for segmentation violation,
161           stack overflow, division by zero...
162         </para>
163         <para>
164           When an exception occurs, Wine checks if the <varname>W-process</varname> is
165           debugged. If so, the exception event is sent to the
166           debugger, which takes care of it: end of the story. This
167           mechanism is part of the standard Windows' debugging API. 
168         </para>
169         <para>
170           If the <varname>W-process</varname> is not debugged, Wine
171           tries to launch a debugger. This debugger (normally
172           <command>WineDbg</command>, see III Configuration for more
173           details), at startup, attaches to the
174           <varname>W-process</varname> which generated the exception
175           event. In this case, you are able to look at the causes of
176           the exception, and either fix the causes (and continue
177           further the execution) or dig deeper to understand what went
178           wrong.
179         </para>
180         <para>
181           If <command>WineDbg</command> is the standard debugger, the
182           <command>pass</command> and <command>cont</command> commands
183           are the two ways to let the process go further for the
184           handling of the  exception event.
185         </para>
186         <para>
187           To be more precise on the way Wine (and Windows) generates
188           exception events, when a fault occurs (segmentation
189           violation, stack overflow...), the event is first sent to
190           the debugger (this is known as a first chance exception).
191           The debugger can give two answers:
192         </para>
193
194         <variablelist>
195           <varlistentry>
196             <term>continue:</term>
197             <listitem>
198               <para>
199                 the debugger had the ability to correct what's
200                 generated the exception, and is now able to continue
201                 process execution.
202               </para>
203             </listitem>
204           </varlistentry>
205           <varlistentry>
206             <term>pass:</term>
207             <listitem>
208               <para>
209                 the debugger couldn't correct the cause of the
210                 first chance exception. Wine will now try to walk
211                 the list of exception handlers to see if one of them
212                 can handle the exception. If no exception handler is
213                 found, the exception is sent once again to the
214                 debugger to indicate the failure of the exception
215                 handling.
216               </para>
217             </listitem>
218           </varlistentry>
219         </variablelist>
220         <note>
221           <para>
222             since some of Wine's code uses exceptions and
223             <function>try/catch</function> blocks to provide some
224             functionality, <command>WineDbg</command> can be entered
225             in such cases with segv exceptions. This happens, for
226             example, with <function>IsBadReadPtr</function> function.
227             In that case, the <command>pass</command> command shall be
228             used, to let the handling of the exception to be done by
229             the <function>catch</function> block in
230             <function>IsBadReadPtr</function>.
231           </para>
232         </note>
233       </sect2>
234
235       <sect2>
236         <title>Quitting</title>
237
238         <para>
239           Unfortunately, Windows doesn't provide a detach kind of API,
240           meaning that once you started debugging a process, you must
241           do so until the process dies. Killing (or stopping/aborting)
242           the debugger will also kill the debugged process. This will
243           be true for any Windows' debugging API compliant debugger,
244           starting with <command>WineDbg</command>.
245         </para>
246       </sect2>
247     </sect1>
248
249
250     <sect1 id="wine-debugger">
251       <title>Using the Wine Debugger</title>
252
253       <para>
254         Written by &name-marcus-meissner; <email>&email-marcus-meissner;</email>,
255         additions welcome.
256       </para>
257       <para>
258         (Extracted from <filename>wine/documentation/debugging</filename>)
259       </para>
260
261       <para>
262         This file describes where to start debugging Wine. If at any
263         point you get stuck and want to ask for help, please read the
264         file <filename>documentation/bugreports</filename> for
265         information on how to write useful bug reports.
266       </para>
267
268       <sect2>
269         <title>Crashes</title>
270
271         <para>
272           These usually show up like this:
273         </para>
274         <screen>
275 |Unexpected Windows program segfault - opcode = 8b
276 |Segmentation fault in Windows program 1b7:c41.
277 |Loading symbols from ELF file /root/wine/wine...
278 |....more Loading symbols from ...
279 |In 16 bit mode.
280 |Register dump:
281 | CS:01b7 SS:016f DS:0287 ES:0000
282 | IP:0c41 SP:878a BP:8796 FLAGS:0246
283 | AX:811e BX:0000 CX:0000 DX:0000 SI:0001 DI:ffff
284 |Stack dump:
285 |0x016f:0x878a:  0001 016f ffed 0000 0000 0287 890b 1e5b
286 |0x016f:0x879a:  01b7 0001 000d 1050 08b7 016f 0001 000d
287 |0x016f:0x87aa:  000a 0003 0004 0000 0007 0007 0190 0000
288 |0x016f:0x87ba:
289 |
290 |0050: sel=0287 base=40211d30 limit=0b93f (bytes) 16-bit rw-
291 |Backtrace:
292 |0 0x01b7:0x0c41 (PXSRV_FONGETFACENAME+0x7c)
293 |1 0x01b7:0x1e5b (PXSRV_FONPUTCATFONT+0x2cd)
294 |2 0x01a7:0x05aa
295 |3 0x01b7:0x0768 (PXSRV_FONINITFONTS+0x81)
296 |4 0x014f:0x03ed (PDOXWIN_@SQLCURCB$Q6CBTYPEULN8CBSCTYPE+0x1b1)
297 |5 0x013f:0x00ac
298 |
299 |0x01b7:0x0c41 (PXSRV_FONGETFACENAME+0x7c):  movw        %es:0x38(%bx),%dx
300         </screen>
301         <para>
302           Steps to debug a crash. You may stop at any step, but please
303           report the bug and provide as much of the information
304           gathered to the newsgroup or the relevant developer as
305           feasible.
306         </para>
307
308         <orderedlist>
309           <listitem>
310             <para>
311               Get the reason for the crash. This is usually an access to
312               an invalid selector, an access to an out of range address
313               in a valid selector, popping a segmentregister from the
314               stack or the like. When reporting a crash, report this
315               <emphasis>whole</emphasis> crashdump even if it doesn't
316               make sense to you.
317             </para>
318             <para>
319               (In this case it is access to an invalid selector, for
320               <systemitem>%es</systemitem> is <literal>0000</literal>, as
321               seen in the register dump).
322             </para>
323           </listitem>
324           <listitem>
325             <para>
326               Determine the cause of the crash. Since this is usually
327               a primary/secondary reaction to a failed or misbehaving
328               Wine function, rerun Wine with <parameter>-debugmsg
329                 +relay</parameter> added to the commandline. This will
330               generate quite a lot of output, but usually the reason is
331               located in the last call(s).  Those lines usually look like
332               this:
333             </para>
334             <screen>
335 |Call KERNEL.90: LSTRLEN(0227:0692 "text") ret=01e7:2ce7 ds=0227
336       ^^^^^^^^^  ^       ^^^^^^^^^ ^^^^^^      ^^^^^^^^^    ^^^^
337       |          |       |         |           |            |Datasegment
338       |          |       |         |           |Return address
339       |          |       |         |textual parameter
340       |          |       |
341       |          |       |Argument(s). This one is a win16 segmented pointer.
342       |          |Function called.
343       |The module, the function is called in. In this case it is KERNEL.
344                         
345 |Ret  KERNEL.90: LSTRLEN() retval=0x0004 ret=01e7:2ce7 ds=0227
346                                   ^^^^^^
347                                   |Returnvalue is 16 bit and has the value 4.
348             </screen>
349           </listitem>
350           <listitem>
351             <para>
352               If you have found a misbehaving function, try to find out
353               why it misbehaves. Find the function in the source code.
354               Try to make sense of the arguments passed. Usually there is
355               a <function>TRACE(&lt;channel>,"(...)\n");</function> at
356               the beginning of the function. Rerun wine with
357               <parameter>-debugmsg +xyz,+relay</parameter> added to the
358               commandline.
359             </para>
360           </listitem>
361           <listitem>
362             <para>
363               Additional information on how to debug using the internal
364               debugger can be  found in
365               <filename>debugger/README</filename>.
366             </para>
367           </listitem>
368           <listitem>
369             <para>
370               If this information isn't clear enough or if you want to
371               know more about what's happening in the function itself,
372               try running wine with <parameter>-debugmsg
373                 +all</parameter>, which dumps ALL included debug
374               information in wine.
375             </para>
376           </listitem>
377           <listitem>
378             <para>
379               If even that isn't enough, add more debug output for
380               yourself into the functions you find relevant.  See
381               <filename>documentation/debug-msgs</filename>. You might
382               also try to run the program in <command>gdb</command>
383               instead of using the WINE-debugger. If you do that, use
384               <parameter>handle SIGSEGV nostop noprint</parameter> to
385               disable the handling of seg faults inside
386               <command>gdb</command> (needed for Win16). If you don't use
387               the <parameter>--desktop</parameter> or
388               <parameter>--managed</parameter> option, start the WINE
389               process with <parameter>--sync</parameter>, or chances are
390               good to get X into an unusable state.
391             </para>
392           </listitem>
393           <listitem>
394             <para>
395               You can also set a breakpoint for that function. Start wine
396               with the <parameter>--debug</parameter> option added to the
397               commandline. After loading the executable wine will enter
398               the internal debugger. Use <parameter>break
399                 KERNEL_LSTRLEN</parameter> (replace by function you want
400               to debug, CASE IS RELEVANT) to set a breakpoint.  Then use
401               <command>continue</command> to start normal
402               program-execution. Wine will stop if it reaches the
403               breakpoint. If the program isn't yet at the crashing call
404               of that function, use <command>continue</command> again
405               until you are about to enter that function. You may now
406               proceed with single-stepping the function until you reach
407               the point of crash. Use the other debugger commands to
408               print registers and the like.
409             </para>
410           </listitem>
411         </orderedlist>
412       </sect2>
413
414       <sect2>
415         <title>Program hangs, nothing happens</title>
416
417         <para>
418           Switch to UNIX shell, get the process-ID using <command>ps -a |
419             grep wine</command>, and do a <command>kill -HUP
420             &lt;pid></command> (without the &lt; and >). Wine will
421           then enter its internal debugger and you can proceed as
422           explained above. Also, you can use
423           <parameter>--debug</parameter> switch and then you can get into
424           internal debugger by pressing 
425           <keycombo><keycap>Ctrl</keycap><keycap>C</keycap></keycombo> in
426           the terminal where you run Wine.
427         </para>
428       </sect2>
429
430       <sect2>
431         <title>Program reports an error with a Messagebox</title>
432
433         <para>
434           Sometimes programs are reporting failure using more or
435           less nondescript messageboxes. We can debug this using the
436           same method as Crashes, but there is one problem... For
437           setting up a message box the program also calls Wine
438           producing huge chunks of debug code.
439         </para>
440         <para>
441           Since the failure happens usually directly before setting up
442           the Messagebox you can start wine with
443           <parameter>--debug</parameter> added to the commandline, set a
444           breakpoint at <function>MessageBoxA</function> (called by win16
445           and win32 programs) and proceed with
446           <command>continue</command>. With <parameter>--debugmsg
447             +all</parameter> Wine will now stop directly before setting
448           up the Messagebox. Proceed as explained above.
449         </para>
450         <para>
451           You can also run wine using <command>wine -debugmsg +relay
452             program.exe 2>&1 | less -i</command> and in
453           <command>less</command> search for <quote>MessageBox</quote>.
454         </para>
455       </sect2>
456
457       <sect2>
458         <title>Disassembling programs:</title>
459
460         <para>
461           You may also try to disassemble the offending program to
462           check for undocumented features and/or use of them.
463         </para>
464         <para>
465           The best, freely available, disassembler for Win16 programs is
466           <application>Windows Codeback</application>, archivename
467           <filename>wcbxxx.zip</filename>, which usually can be found in
468           the <filename>Cica-Mirror</filename> subdirectory on the WINE
469           ftpsites. (See <filename>ANNOUNCE</filename>).
470         </para>
471         <para>
472           Disassembling win32 programs is possible using
473           <application>Windows Disassembler 32</application>, archivename
474           something like <filename>w32dsm87.zip</filename> (or similar)
475           on <systemitem class="systemname">ftp.winsite.com</systemitem>
476           and mirrors.  The shareware version does not allow saving of
477           disassembly listings. You can also use the newer (and in the
478           full version better) <application>Interactive
479             Disassembler</application> (IDA) from the ftp sites mentioned
480           at the end of the document. Understanding disassembled code is
481           mostly a question of exercise.
482         </para>
483         <para>
484           Most code out there uses standard C function entries (for it
485           is usually  written in C). Win16 function entries usually
486           look like that:
487         </para>
488         <programlisting>
489 push bp
490 mov bp, sp
491 ... function code ..
492 retf XXXX       &lt;--------- XXXX is number of bytes of arguments
493         </programlisting>
494         <para>
495           This is a <function>FAR</function> function with no local
496           storage. The arguments usually start at
497           <literal>[bp+6]</literal> with increasing offsets. Note, that
498           <literal>[bp+6]</literal> belongs to the
499           <emphasis>rightmost</emphasis> argument, for exported win16
500           functions use the PASCAL calling convention. So, if we use
501           <function>strcmp(a,b)</function> with <parameter>a</parameter>
502           and <parameter>b</parameter> both 32 bit variables
503           <parameter>b</parameter> would be at <literal>[bp+6]</literal>
504           and <parameter>a</parameter> at <literal>[bp+10]</literal>.
505         </para>
506         <para>
507           Most functions make also use of local storage in the stackframe:
508         </para>
509         <programlisting>
510 enter 0086, 00
511 ... function code ...
512 leave
513 retf XXXX
514         </programlisting>
515         <para>
516           This does mostly the same as above, but also adds
517           <literal>0x86</literal> bytes of stackstorage, which is
518           accessed using <literal>[bp-xx]</literal>. Before calling a
519           function, arguments are pushed on the stack using something
520           like this:
521         </para>
522         <programlisting>
523 push word ptr [bp-02]   &lt;- will be at [bp+8]
524 push di                 &lt;- will be at [bp+6]
525 call KERNEL.LSTRLEN
526         </programlisting>
527         <para>
528           Here first the selector and then the offset to the passed
529           string are pushed.
530         </para>
531       </sect2>
532
533       <sect2>
534         <title>Sample debugging session:</title>
535
536         <para>
537           Let's debug the infamous Word <filename>SHARE.EXE</filename>
538           messagebox: 
539         </para>
540         <screen>
541 |marcus@jet $ wine winword.exe
542 |            +---------------------------------------------+
543 |            | !  You must leave Windows and load SHARE.EXE|
544 |            |    before starting Word.                    |
545 |            +---------------------------------------------+
546         </screen>
547         <screen>
548 |marcus@jet $ wine winword.exe -debugmsg +relay -debug
549 |CallTo32(wndproc=0x40065bc0,hwnd=000001ac,msg=00000081,wp=00000000,lp=00000000)
550 |Win16 task 'winword': Breakpoint 1 at 0x01d7:0x001a
551 |CallTo16(func=0127:0070,ds=0927)
552 |Call WPROCS.24: TASK_RESCHEDULE() ret=00b7:1456 ds=0927
553 |Ret  WPROCS.24: TASK_RESCHEDULE() retval=0x8672 ret=00b7:1456 ds=0927
554 |CallTo16(func=01d7:001a,ds=0927)
555 |     AX=0000 BX=3cb4 CX=1f40 DX=0000 SI=0000 DI=0927 BP=0000 ES=11f7
556 |Loading symbols: /home/marcus/wine/wine...
557 |Stopped on breakpoint 1 at 0x01d7:0x001a
558 |In 16 bit mode.
559 |Wine-dbg>break MessageBoxA                          &lt;---- Set Breakpoint
560 |Breakpoint 2 at 0x40189100 (MessageBoxA [msgbox.c:190])
561 |Wine-dbg>c                                            &lt;---- Continue
562 |Call KERNEL.91: INITTASK() ret=0157:0022 ds=08a7
563 |     AX=0000 BX=3cb4 CX=1f40 DX=0000 SI=0000 DI=08a7 ES=11d7 EFL=00000286
564 |CallTo16(func=090f:085c,ds=0dcf,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0dcf)
565 |...                                                   &lt;----- Much debugoutput
566 |Call KERNEL.136: GETDRIVETYPE(0x0000) ret=060f:097b ds=0927
567                                ^^^^^^ Drive 0 (A:)
568 |Ret  KERNEL.136: GETDRIVETYPE() retval=0x0002 ret=060f:097b ds=0927
569                                         ^^^^^^  DRIVE_REMOVEABLE
570                                                 (It is a floppy diskdrive.)
571
572 |Call KERNEL.136: GETDRIVETYPE(0x0001) ret=060f:097b ds=0927
573                                ^^^^^^ Drive 1 (B:)
574 |Ret  KERNEL.136: GETDRIVETYPE() retval=0x0000 ret=060f:097b ds=0927
575                                         ^^^^^^  DRIVE_CANNOTDETERMINE
576                                                 (I don't have drive B: assigned)
577
578 |Call KERNEL.136: GETDRIVETYPE(0x0002) ret=060f:097b ds=0927
579                                ^^^^^^^ Drive 2 (C:)
580 |Ret  KERNEL.136: GETDRIVETYPE() retval=0x0003 ret=060f:097b ds=0927
581                                         ^^^^^^ DRIVE_FIXED
582                                                (specified as a harddisk)
583
584 |Call KERNEL.97: GETTEMPFILENAME(0x00c3,0x09278364"doc",0x0000,0927:8248) ret=060f:09b1 ds=0927
585                                  ^^^^^^           ^^^^^        ^^^^^^^^^
586                                  |                |            |buffer for fname
587                                  |                |temporary name ~docXXXX.tmp
588                                  |Force use of Drive C:.
589
590 |Warning: GetTempFileName returns 'C:~doc9281.tmp', which doesn't seem to be writeable.
591 |Please check your configuration file if this generates a failure.
592         </screen>
593         <para>
594           Whoops, it even detects that something is wrong!
595         </para>
596         <screen>
597 |Ret  KERNEL.97: GETTEMPFILENAME() retval=0x9281 ret=060f:09b1 ds=0927
598                                           ^^^^^^ Temporary storage ID
599
600 |Call KERNEL.74: OPENFILE(0x09278248"C:~doc9281.tmp",0927:82da,0x1012) ret=060f:09d8 ds=0927
601                                     ^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^
602                                     |filename        |OFSTRUCT |open mode:
603
604                                        OF_CREATE|OF_SHARE_EXCLUSIVE|OF_READWRITE
605         </screen>
606         <para>
607           This fails, since my <medialabel>C:</medialabel> drive is in
608           this case mounted readonly.
609         </para>
610         <screen>
611 |Ret  KERNEL.74: OPENFILE() retval=0xffff ret=060f:09d8 ds=0927
612                                    ^^^^^^ HFILE_ERROR16, yes, it failed.
613
614 |Call USER.1: MESSAGEBOX(0x0000,0x09278376"Sie mussen Windows verlassen und SHARE.EXE laden bevor Sie Word starten.",0x00000000,0x1030) ret=060f:084f ds=0927
615         </screen>           
616         <para>
617           And MessageBox'ed.
618         </para>
619         <screen>
620 |Stopped on breakpoint 2 at 0x40189100 (MessageBoxA [msgbox.c:190])
621 |190     {              &lt;- the sourceline
622 In 32 bit mode.
623 Wine-dbg>
624         </screen>
625         <para>
626           The code seems to find a writeable harddisk and tries to create
627           a file there. To work around this bug, you can define
628           <medialabel>C:</medialabel> as a networkdrive, which is ignored
629           by the code above.
630         </para>
631       </sect2>
632
633       <sect2>
634         <title>Debugging Tips</title>
635
636         <para>
637           Here are some useful debugging tips, added by Andreas Mohr:
638         </para>
639
640         <itemizedlist>
641           <listitem>
642             <para>
643               If you have a program crashing at such an early loader phase that you can't
644               use the Wine debugger normally, but Wine already executes the program's
645               start code, then you may use a special trick. You should do a
646               <programlisting>
647 wine --debugmsg +relay program
648               </programlisting>
649               to get a listing of the functions the program calls in its start function.
650               Now you do a
651               <programlisting>
652 wine --debug winfile.exe
653               </programlisting>
654             </para>
655             <para>
656               This way, you get into <command>Wine-dbg</command>. Now you
657               can set a breakpoint on any function the program calls in
658               the start function and just type <userinput>c</userinput>
659               to bypass the eventual calls of Winfile to this function
660               until you are finally at the place where this function gets
661               called by the crashing start function. Now you can proceed
662               with your debugging as usual.
663             </para>
664           </listitem>
665           <listitem>
666             <para>
667               If you try to run a program and it quits after showing an error messagebox,
668               the problem can usually be identified in the return value of one of the
669               functions executed before <function>MessageBox()</function>.
670               That's why you should re-run the program with e.g.
671               <programlisting>
672 wine --debugmsg +relay &lt;program name> &>relmsg
673               </programlisting>
674               Then do a <command>more relmsg</command> and search for the
675               last occurrence of a call to the string "MESSAGEBOX". This is a line like
676               <programlisting>
677 Call USER.1: MESSAGEBOX(0x0000,0x01ff1246 "Runtime error 219 at 0004:1056.",0x00000000,0x1010) ret=01f7:2160 ds=01ff
678               </programlisting>
679               In my example the lines before the call to
680               <function>MessageBox()</function> look like that:
681               <programlisting>
682 Call KERNEL.96: FREELIBRARY(0x0347) ret=01cf:1033 ds=01ff
683 CallTo16(func=033f:0072,ds=01ff,0x0000)
684 Ret  KERNEL.96: FREELIBRARY() retval=0x0001 ret=01cf:1033 ds=01ff
685 Call KERNEL.96: FREELIBRARY(0x036f) ret=01cf:1043 ds=01ff
686 CallTo16(func=0367:0072,ds=01ff,0x0000)
687 Ret  KERNEL.96: FREELIBRARY() retval=0x0001 ret=01cf:1043 ds=01ff
688 Call KERNEL.96: FREELIBRARY(0x031f) ret=01cf:105c ds=01ff
689 CallTo16(func=0317:0072,ds=01ff,0x0000)
690 Ret  KERNEL.96: FREELIBRARY() retval=0x0001 ret=01cf:105c ds=01ff
691 Call USER.171: WINHELP(0x02ac,0x01ff05b4 "COMET.HLP",0x0002,0x00000000) ret=01cf:1070 ds=01ff
692 CallTo16(func=0117:0080,ds=01ff)
693 Call WPROCS.24: TASK_RESCHEDULE() ret=00a7:0a2d ds=002b
694 Ret  WPROCS.24: TASK_RESCHEDULE() retval=0x0000 ret=00a7:0a2d ds=002b
695 Ret  USER.171: WINHELP() retval=0x0001 ret=01cf:1070 ds=01ff
696 Call KERNEL.96: FREELIBRARY(0x01be) ret=01df:3e29 ds=01ff
697 Ret  KERNEL.96: FREELIBRARY() retval=0x0000 ret=01df:3e29 ds=01ff
698 Call KERNEL.52: FREEPROCINSTANCE(0x02cf00ba) ret=01f7:1460 ds=01ff
699 Ret  KERNEL.52: FREEPROCINSTANCE() retval=0x0001 ret=01f7:1460 ds=01ff
700 Call USER.1: MESSAGEBOX(0x0000,0x01ff1246 "Runtime error 219 at 0004:1056.",0x00000000,0x1010) ret=01f7:2160 ds=01ff
701               </programlisting>
702             </para>
703             <para>
704               I think that the call to <function>MessageBox()</function>
705               in this example is <emphasis>not</emphasis> caused by a
706               wrong result value of some previously executed function
707               (it's happening quite often like that), but instead the
708               messagebox complains about a runtime error at
709               <literal>0x0004:0x1056</literal>.
710             </para>
711             <para>
712               As the segment value of the address is only
713               <literal>4</literal>, I think that that is only an internal
714               program value. But the offset address reveals something
715               quite interesting: Offset <literal>1056</literal> is
716               <emphasis>very</emphasis> close to the return address of
717               <function>FREELIBRARY()</function>:
718               <programlisting>
719 Call KERNEL.96: FREELIBRARY(0x031f) ret=01cf:105c ds=01ff
720                                              ^^^^
721               </programlisting>
722             </para>
723             <para>
724               Provided that segment <literal>0x0004</literal> is indeed segment
725               <literal>0x1cf</literal>, we now we can use IDA                 (available at
726               <ulink url="ftp://ftp.uni-koeln.de/pc/msdos/programming/assembler/ida35bx.zip">
727                 ftp://ftp.uni-koeln.de/pc/msdos/programming/assembler/ida35bx.zip</ulink>) to
728               disassemble the part that caused the error. We just have to find the address of
729               the call to <function>FreeLibrary()</function>. Some lines before that the
730               runtime error occurred. But be careful! In some cases you don't have to
731               disassemble the main program, but instead some DLL called by it in order to find
732               the correct place where the runtime error occurred. That can be determined by
733               finding the origin of the segment value (in this case <literal>0x1cf</literal>).
734             </para>
735           </listitem>
736           <listitem>
737             <para>
738               If you have created a relay file of some crashing
739               program and want to set a breakpoint at a certain
740               location which is not yet available as the program loads
741               the breakpoint's segment during execution, you may set a
742               breakpoint to <function>GetVersion16/32</function> as
743               those functions are called very often.
744             </para>
745             <para>
746               Then do a <userinput>c</userinput> until you are able to
747               set this breakpoint without error message.
748             </para>
749           </listitem>
750           <listitem>
751             <para>
752               Some useful programs:
753             </para>
754             <variablelist>
755               <varlistentry>
756                 <term>
757                   <application>IDA</application>: 
758                   <filename>
759                     <ulink url="ftp://ftp.uni-koeln.de/pc/msdos/programming/assembler/ida35bx.zip">
760                       ftp://ftp.uni-koeln.de/pc/msdos/programming/assembler/ida35bx.zip</ulink>
761                   </filename>
762                 </term>
763                 <listitem>
764                   <para>
765                     <emphasis>Very</emphasis> good DOS disassembler ! It's badly needed
766                     for debugging Wine sometimes.
767                   </para>
768                 </listitem>
769               </varlistentry>
770               <varlistentry>
771                 <term>
772                   <application>XRAY</application>:
773                   <filename>
774                     <ulink url="ftp://ftp.th-darmstadt.de/pub/machines/ms-dos/SimTel/msdos/asmutil/xray15.zip">
775                       ftp://ftp.th-darmstadt.de/pub/machines/ms-dos/SimTel/msdos/asmutil/xray15.zip</ulink>
776                   </filename>
777                 </term>
778                 <listitem>
779                   <para>
780                     Traces DOS calls (Int 21h, DPMI, ...). Use it with
781                     Windows to correct file management problems etc.
782                   </para>
783                 </listitem>
784               </varlistentry>
785               <varlistentry>
786                 <term>
787                   <application>pedump</application>:
788                   <filename>
789                     <ulink url="http://oak.oakland.edu/pub/simtelnet/win95/prog/pedump.zip">
790                       http://oak.oakland.edu/pub/simtelnet/win95/prog/pedump.zip</ulink>
791                   </filename>
792                 </term>
793                 <listitem>
794                   <para>
795                     Dumps the imports and exports of a PE (Portable
796                     Executable) DLL.
797                   </para>
798                 </listitem>
799               </varlistentry>
800             </variablelist>
801           </listitem>
802         </itemizedlist>
803       </sect2>
804
805       <sect2>
806         <title>Some basic debugger usages:</title>
807
808         <para>
809           After starting your program with
810         </para>
811         <screen>
812 wine -debug myprog.exe
813         </screen>
814         <para>
815           the program loads and you get a prompt at the program
816           starting point. Then you can set breakpoints:
817         </para>
818         <screen>
819   b RoutineName      (by outine name) OR
820   b *0x812575        (by address)
821         </screen>
822         <para>
823           Then you hit <command>c</command> (continue) to run the
824           program. It stops at the breakpoint. You can type
825         </para>
826         <screen>
827   step               (to step one line) OR
828   stepi              (to step one machine instruction at a time;
829                       here, it helps to know the basic 386
830                       instruction set)
831   info reg           (to see registers)
832   info stack         (to see hex values in the stack)
833   info local         (to see local variables)
834   list &lt;line number> (to list source code)
835   x &lt;variable name>  (to examine a variable; only works if code
836                       is not compiled with optimization)
837   x 0x4269978        (to examine a memory location)
838   ?                  (help)
839   q                  (quit)
840         </screen>
841         <para>
842           By hitting <keycap>Enter</keycap>, you repeat the last
843           command.
844         </para>
845       </sect2>
846     </sect1>
847
848
849     <sect1 id="memory-addresses">
850       <title>Useful memory addresses</title>
851       <para>
852         Written by &name-andreas-mohr; <email>&email-andreas-mohr;</email>
853       </para>
854       <para>
855         Wine uses several different kinds of memory addresses.
856       </para>
857       <variablelist>
858         <varlistentry>
859           <term>
860             Win32/"normal" Wine addresses/Linux: linear addresses.
861           </term>
862           <listitem>
863             <para>
864               Linear addresses can be everything from 0x0 up to
865               0xffffffff.  In Wine on Linux they are often around
866               e.g. 0x08000000, 0x00400000 (std. Win32 program load
867               address), 0x40000000.  Every Win32 process has its own
868               private 4GB address space (that is, from 0x0 up to
869               0xffffffff).
870             </para>
871           </listitem>
872         </varlistentry>
873         <varlistentry>
874           <term>
875             Win16 "enhanced mode": segmented addresses.
876           </term>
877           <listitem>
878             <para>
879               These are the "normal" Win16 addresses, called SEGPTR.
880               They have a segment:offset notation, e.g. 0x01d7:0x0012.
881               The segment part usually is a "selector", which *always*
882               has the lowest 3 bits set.  Some sample selectors are
883               0x1f7, 0x16f, 0x8f.  If these bits are set except for
884               the lowest bit, as e.g. with 0x1f6,xi then it might be a
885               handle to global memory. Just set the lowest bit to get
886               the selector in these cases.  A selector kind of
887               "points" to a certain linear (see above) base address.
888               It has more or less three important attributes: segment
889               base address, segment limit, segment access rights.
890             </para>
891             <para>
892               Example:
893             </para>
894             <para>
895               Selector 0x1f7 (0x40320000, 0x0000ffff, r-x) So 0x1f7
896               has a base address of 0x40320000, the segment's last
897               address is 0x4032ffff (limit 0xffff), and it's readable
898               and executable.  So an address of 0x1f7:0x2300 would be
899               the linear address of 0x40322300.
900             </para>
901           </listitem>
902         </varlistentry>
903         <varlistentry>
904           <term>
905             DOS/Win16 "standard mode"
906           </term>
907           <listitem>
908             <para>
909               They, too, have a segment:offset notation.  But they are
910               completely different from "normal" Win16 addresses, as
911               they just represent at most 1MB of memory: The segment
912               part can be anything from 0 to 0xffff, and it's the same
913               with the offset part.
914             </para>
915             <para>
916               Now the strange thing is the calculation that's behind
917               these addresses: Just calculate segment*16 + offset in
918               order to get a "linear DOS" address.  So
919               e.g. 0x0f04:0x3628 results in 0xf040 + 0x3628 = 0x12668.
920               And the highest address you can get is 0xfffff (1MB), of
921               course.  In Wine, this "linear DOS" address of 0x12668
922               has to be added to the linear base address of the
923               corresponding DOS memory allocated for dosmod in order
924               to get the true linear address of a DOS seg:offs
925               address.  And make sure that you're doing this in the
926               correct process with the correct linear address space,
927               of course ;-)
928             </para>
929           </listitem>
930         </varlistentry>
931       </variablelist>
932     </sect1>
933
934     <sect1 id="dbg-config">
935       <title>Configuration</title>
936
937       <sect2>
938         <title>Registry configuration</title>
939
940         <para>
941           The Windows' debugging API uses a registry entry to know
942           which debugger to invoke when an unhandled exception occurs
943           (see <link endterm="dbg-exception-title"
944           linkend="dbg-on-exception"></link> for some details). Two
945           values in key
946         </para>
947         <programlisting>
948 "MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug"
949         </programlisting>
950         <para>
951           Determine the behavior:
952         </para>
953         <variablelist>
954           <varlistentry>
955             <term>Debugger:</term>
956             <listitem>
957               <para>
958                 this is the command line used to launch the debugger
959                 (it uses two <function>printf</function> formats
960                 (<literal>%ld</literal>) to pass context dependent
961                 information to  the debugger). You should put here a
962                 complete path to your debugger
963                 (<command>WineDbg</command> can of course be used, but
964                 any other Windows' debugging API aware debugger will
965                 do).
966                 The path to the debugger you chose to use must be reachable
967                 via a DOS drive in the Wine config file !
968               </para>
969               <para>
970                 You can also set a shell script to launch the debugger. In
971                 this case, you need to be sure that the invocation in
972                 this shell script is of the form:
973                 <programlisting>
974                   WINEPRELOAD=&lt;path_to_winedbg.so&gt; exec wine $*
975                 </programlisting>
976                 (Shell script must use exec, and the debugger .so file must
977                 be preloaded to override the shell script information).
978               </para>
979             </listitem>
980           </varlistentry>
981           <varlistentry>
982             <term>Auto:</term>
983             <listitem>
984               <para>
985                 if this value is zero, a message box will ask the
986                 user if he/she wishes to launch the debugger when an
987                 unhandled exception occurs. Otherwise, the debugger
988                 is automatically started.
989               </para>
990             </listitem>
991           </varlistentry>
992         </variablelist>
993
994         <para>
995           A regular Wine registry looks like:
996         </para>
997         <programlisting>
998 [MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug] 957636538
999 "Auto"=dword:00000001
1000 "Debugger"="/usr/local/bin/winedbg %ld %ld"
1001         </programlisting>
1002
1003         <note>
1004           <title>Note 1</title>
1005           <para>
1006             creating this key is mandatory. Not doing so will not
1007             fire the debugger when an exception occurs.
1008           </para>
1009         </note>
1010         <note>
1011           <title>Note 2</title>
1012           <para>
1013             <command>wineinstall</command> sets up this correctly.
1014             However, due to some limitation of the registry installed,
1015             if a previous Wine installation exists, it's safer to
1016             remove the whole
1017           </para>
1018           <programlisting>
1019 [MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug]
1020           </programlisting>
1021           <para>
1022             key before running again <command>wineinstall</command> to
1023             regenerate this key.
1024           </para>
1025         </note>
1026       </sect2>
1027
1028       <sect2>
1029         <title>WineDbg configuration</title>
1030
1031         <para>
1032           <command>WineDbg</command> can be configured thru a number
1033           of options. Those options are stored in the registry, on a
1034           per user basis. The key is (in <emphasis>my</emphasis> registry)
1035         </para>
1036         <programlisting>
1037 [eric\\Software\\Wine\\WineDbg]
1038         </programlisting>
1039         <para>
1040           Those options can be read/written while inside
1041           <command>WineDbg</command>, as part of the debugger
1042           expressions. To refer to one of these options, its name must
1043           be  prefixed by a <literal>$</literal> sign. For example, 
1044         </para>
1045         <programlisting>
1046 set $BreakAllThreadsStartup = 1
1047         </programlisting>
1048         <para>
1049           sets the option <varname>BreakAllThreadsStartup</varname> to
1050           <literal>TRUE</literal>.
1051         </para>
1052         <para>
1053           All the options are read from the registry when
1054           <command>WineDbg</command> starts (if no corresponding value
1055           is found, a default value is used), and are written back to
1056           the registry when <command>WineDbg</command> exits (hence,
1057           all modifications to those options are automatically saved
1058           when <command>WineDbg</command> terminates).
1059         </para>
1060         <para>
1061           Here's the list of all options:
1062         </para>
1063
1064         <sect3>
1065           <title>Controlling when the debugger is entered</title>
1066
1067           <variablelist>
1068             <varlistentry>
1069               <term><varname>BreakAllThreadsStartup</varname></term>
1070               <listitem>
1071                 <para>
1072                   Set to <literal>TRUE</literal> if at all threads
1073                   start-up the debugger stops  set to
1074                   <literal>FALSE</literal> if only at the first thread
1075                   startup of a given process the debugger stops.
1076                   <literal>FALSE</literal> by default.
1077                 </para>
1078               </listitem>
1079             </varlistentry>
1080             <varlistentry>
1081               <term><varname>BreakOnCritSectTimeOut</varname></term>
1082               <listitem>
1083                 <para>
1084                   Set to <literal>TRUE</literal> if the debugger stops
1085                   when a critical section times out (5 minutes);
1086                   <literal>TRUE</literal> by default.
1087                 </para>
1088               </listitem>
1089             </varlistentry>
1090             <varlistentry>
1091               <term><varname>BreakOnAttach</varname></term>
1092               <listitem>
1093                 <para>
1094                   Set to <literal>TRUE</literal> if when
1095                   <command>WineDbg</command> attaches to an existing
1096                   process after an unhandled exception,
1097                   <command>WineDbg</command> shall be entered on the
1098                   first attach event. Since the attach event is
1099                   meaningless in the context of an exception event
1100                   (the next event  which is the exception event is of
1101                   course relevant), that option is likely to be
1102                   <literal>FALSE</literal>.
1103                 </para>
1104               </listitem>
1105             </varlistentry>
1106             <varlistentry>
1107               <term><varname>BreakOnFirstChance</varname></term>
1108               <listitem>
1109                 <para>
1110                   An exception can generate two debug events. The
1111                   first one is passed to the debugger (known as a
1112                   first chance) just after the exception. The debugger
1113                   can then decides either to resume execution (see
1114                   <command>WineDbg</command>'s <command>cont</command>
1115                   command) or pass the exception up to the exception
1116                   handler chain in the program (if it exists)
1117                   (<command>WineDbg</command> implements this thru the
1118                   <command>pass</command> command). If none of the
1119                   exception handlers takes care of the exception, the
1120                   exception event is sent again to the debugger (known
1121                   as last chance exception). You cannot pass on a last
1122                   exception. When the
1123                   <varname>BreakOnFirstChance</varname> exception is
1124                   <literal>TRUE</literal>, then winedbg is entered for
1125                   both first and last chance execptions (to
1126                   <literal>FALSE</literal>, it's only entered for last
1127                   chance exceptions).
1128                 </para>
1129               </listitem>
1130             </varlistentry>
1131             <varlistentry>
1132               <term><varname>BreakOnDllLoad</varname></term>
1133               <listitem>
1134                 <para>
1135                   Set to <literal>TRUE</literal> if the debugger stops
1136                   when a DLL is loaded into memory; when the debugger 
1137                   is invoked after a crash, the DLLs already mapped in 
1138                   memory will not trigger this break.
1139                   <literal>FALSE</literal> by default.
1140                 </para>
1141               </listitem>
1142             </varlistentry>
1143           </variablelist>
1144         </sect3>
1145
1146         <sect3>
1147           <title>Output handling</title>
1148
1149           <variablelist>
1150             <varlistentry>
1151               <term><varname>ConChannelMask</varname></term>
1152               <listitem>
1153                 <para>
1154                   Mask of active debugger output channels on console 
1155                 </para>
1156               </listitem>
1157             </varlistentry>
1158             <varlistentry>
1159               <term><varname>StdChannelMask</varname></term>
1160               <listitem>
1161                 <para>
1162                   Mask of active debugger output channels on <filename>stderr</filename>
1163                 </para>
1164               </listitem>
1165             </varlistentry>
1166             <varlistentry>
1167               <term><varname>UseXTerm</varname></term>
1168               <listitem>
1169                 <para>
1170                   Set to <literal>TRUE</literal> if the debugger uses
1171                   its own <command>xterm</command> window for console
1172                   input/output.  Set to <literal>FALSE</literal> if
1173                   the debugger uses the current Unix console for
1174                   input/output
1175                 </para>
1176               </listitem>
1177             </varlistentry>
1178           </variablelist>
1179
1180           <para>
1181             Those last 3 variables are jointly used in two generic ways:
1182           </para>
1183
1184           <orderedlist>
1185             <listitem>
1186               <para>default</para>
1187               <programlisting>
1188 ConChannelMask = DBG_CHN_MESG (1)
1189 StdChannelMask = 0
1190 UseXTerm = 1
1191               </programlisting>
1192               <para>
1193                 In this case, all input/output goes into a specific
1194                 <command>xterm</command> window (but all debug
1195                 messages <function>TRACE</function>,
1196                 <function>WARN</function>... still goes to tty where
1197                 wine is run from).
1198               </para>
1199             </listitem>
1200             <listitem>
1201               <para>
1202                 to have all input/output go into the tty where Wine
1203                 was started from (to be used in a X11-free
1204                 environment)
1205               </para>
1206               <screen>
1207 ConChannelMask = 0
1208 StdChannelMask = DBG_CHN_MESG (1)
1209 UseXTerm = 1
1210               </screen>
1211             </listitem>
1212           </orderedlist>
1213           <para>
1214             Those variables also allow, for example for debugging
1215             purposes, to use: 
1216           </para>
1217           <screen>
1218 ConChannelMask = 0xfff
1219 StdChannelMask = 0xfff
1220 UseXTerm = 1
1221           </screen>
1222           <para>
1223             This allows to redirect all <function>WineDbg</function>
1224             output to both tty Wine was started from, and
1225             <command>xterm</command> debugging window. If Wine (or
1226             <command>WineDbg</command>) was started with a redirection
1227             of <filename>stdout</filename> and/or
1228             <filename>stderr</filename> to a file (with for
1229             example &gt;& shell redirect command), you'll get in that
1230             file both outputs. It may be interesting to look in the
1231             relay trace for specific values which the process segv'ed
1232             on.
1233           </para>
1234         </sect3>
1235         
1236         <sect3>
1237           <title>Context information</title>
1238
1239           <variablelist>
1240             <varlistentry>
1241               <term><varname>ThreadId</varname></term>
1242               <listitem>
1243                 <para>ID of the <varname>W-thread</varname> currently
1244                   examined by the debugger</para>
1245               </listitem>
1246             </varlistentry>
1247             <varlistentry>
1248               <term><varname>ProcessId</varname></term>
1249               <listitem>
1250                 <para>ID of the <varname>W-thread</varname> currently
1251                   examined by the debugger</para>
1252               </listitem>
1253             </varlistentry>
1254             <varlistentry>
1255               <term>&lt;registers></term>
1256               <listitem>
1257                 <para>All CPU registers are also available</para>
1258               </listitem>
1259             </varlistentry>
1260           </variablelist>
1261
1262           <para>
1263             The <varname>ThreadId</varname> and
1264             <varname>ProcessId</varname> variables can be handy to set
1265             conditional breakpoints on a given thread or process.
1266           </para>
1267         </sect3>
1268       </sect2>
1269     </sect1>
1270
1271
1272     <sect1 id="dbg-commands">
1273       <title>WineDbg Command Reference</title>
1274
1275       <sect2>
1276         <title>Misc</title>
1277
1278         <screen>
1279 abort           aborts the debugger
1280 quit            exits the debugger
1281
1282 attach N        attach to a W-process (N is its ID). IDs can be
1283                 obtained thru walk process command
1284         </screen>
1285         <screen>
1286 help            prints some help on the commands
1287 help info       prints some help on info commands
1288         </screen>
1289         <screen>
1290 mode 16         switch to 16 bit mode
1291 mode 32         switch to 32 bit mode
1292         </screen>
1293       </sect2>
1294
1295       <sect2>
1296         <title>Flow control</title>
1297
1298         <screen>
1299 cont            continue execution until next breakpoint or exception.
1300 pass            pass the exception event up to the filter chain. 
1301 step            continue execution until next C line of code (enters
1302                 function call)
1303 next            continue execution until next C line of code (doesn't
1304                 enter function call) 
1305 stepi           execute next assembly instruction (enters function
1306                 call)
1307 nexti           execute next assembly instruction (doesn't enter
1308                 function call)
1309 finish          do nexti commands until current function is exited
1310         </screen>
1311         <para>
1312           cont, step, next, stepi, nexti can be postfixed by a
1313           number (N), meaning that the command must be executed N
1314           times.
1315         </para>
1316       </sect2>
1317
1318       <sect2>
1319         <title>Breakpoints, watch points</title>
1320
1321         <screen>
1322 enable N        enables (break|watch)point #N
1323 disable N       disables (break|watch)point #N
1324 delete N        deletes  (break|watch)point #N
1325 cond N          removes any a existing condition to (break|watch)point N
1326 cond N &lt;expr&gt;     adds condition &lt;expr&gt; to (break|watch)point N. &lt;expr&gt;
1327                 will be evaluated each time the breakpoint is hit. If
1328                 the result is a zero value, the breakpoint isn't
1329                 triggered 
1330 break * N       adds a breakpoint at address N
1331 break &lt;id&gt;        adds a breakpoint at the address of symbol &lt;id&gt;
1332 break &lt;id&gt; N      adds a breakpoint at the address of symbol &lt;id&gt; (N ?)
1333 break N         adds a breakpoint at line N of current source file
1334 break           adds a breakpoint at current $pc address
1335 watch * N       adds a watch command (on write) at address N (on 4 bytes)
1336 watch &lt;id&gt;        adds a watch command (on write) at the address of
1337                 symbol &lt;id&gt;
1338 info break      lists all (break|watch)points (with state)
1339         </screen>
1340         <para>
1341           When setting a breakpoint on an &lt;id&gt;, if several symbols with this 
1342           &lt;id&gt; exist, the debugger will prompt for the symbol you want to use. 
1343           Pick up the one you want from its number.
1344         </para>
1345       </sect2>
1346
1347       <sect2>
1348         <title>Stack manipulation</title>
1349
1350         <screen>
1351 bt              print calling stack of current thread
1352 bt N            print calling stack of thread of ID N (note: this
1353                 doesn't change the position of the current frame as
1354                 manipulated by the up & dn commands)
1355 up              goes up one frame in current thread's stack
1356 up N            goes up N frames in current thread's stack
1357 dn              goes down one frame in current thread's stack
1358 dn N            goes down N frames in current thread's stack
1359 frame N         set N as the current frame for current thread's stack
1360 info local      prints information on local variables for current
1361                 function 
1362         </screen>
1363       </sect2>
1364
1365       <sect2>
1366         <title>Directory & source file manipulation</title>
1367
1368         <screen>
1369 show dir
1370 dir &lt;pathname&gt;
1371 dir
1372 symbolfile &lt;module&gt; &lt;pathname&gt;
1373         </screen>
1374         <screen>
1375 list            lists 10 source lines from current position
1376 list -          lists 10 source lines before current position
1377 list N          lists 10 source lines from line N in current file
1378 list &lt;path&gt;:N     lists 10 source lines from line N in file &lt;path&gt;
1379 list &lt;id&gt; lists 10 source lines of function &lt;id&gt;
1380 list * N        lists 10 source lines from address N
1381         </screen>
1382         <para>
1383           You can specify the end target (to change the 10 lines
1384           value) using the ','. For example:
1385         </para>
1386         <screen>
1387 list 123, 234   lists source lines from line 123 up to line 234 in
1388                 current file
1389 list foo.c:1,56 lists source lines from line 1 up to 56 in file foo.c
1390         </screen>
1391       </sect2>
1392
1393       <sect2>
1394         <title>Displaying</title>
1395
1396         <para>
1397           A display is an expression that's evaluated and printed
1398           after the execution of any <command>WineDbg</command>
1399           command.
1400         </para>
1401         <screen>
1402 display         lists the active displays
1403 info display    (same as above command)
1404 display &lt;expr&gt;    adds a display for expression &lt;expr&gt;
1405 display /fmt &lt;expr&gt;       adds a display for expression &lt;expr&gt;. Printing 
1406                 evaluated &lt;expr&gt; is done using the given format (see
1407                 print command for more on formats)
1408 del display N   deletes display #N
1409 undisplay N     (same as del display)
1410         </screen>
1411       </sect2>
1412
1413       <sect2>
1414         <title>Disassembly</title>
1415
1416         <screen>
1417 disas           disassemble from current position
1418 disas &lt;expr&gt;      disassemble from address &lt;expr&gt;
1419 disas &lt;expr&gt;,&lt;expr&gt;disassembles code between addresses specified by
1420                 the two &lt;expr&gt;
1421         </screen>
1422       </sect2>
1423
1424       <sect2>
1425         <title>Information on Wine's internals</title>
1426
1427         <screen>
1428 info class &lt;id&gt;   prints information on Windows's class &lt;id&gt;
1429 walk class      lists all Windows' class registered in Wine
1430 info share      lists all the dynamic libraries loaded the debugged
1431                 program (including .so files, NE and PE DLLs)
1432 info module N   prints information on module of handle N
1433 walk module     lists all modules loaded by debugged program
1434 info queue N    prints information on Wine's queue N
1435 walk queue      lists all queues allocated in Wine
1436 info regs       prints the value of CPU register
1437 info segment N  prints information on segment N
1438 info segment    lists all allocated segments
1439 info stack      prints the values on top of the stack
1440 info map        lists all virtual mappings used by the debugged
1441                 program 
1442 info wnd N      prints information of Window of handle N
1443 walk wnd        lists all the window hierarchy starting from the
1444                 desktop window
1445 walk wnd N      lists all the window hierarchy starting from the
1446                 window of handle N
1447 walk process    lists all w-processes in Wine session
1448 walk thread     lists all w-threads in Wine session
1449 walk modref     (no longer avail)
1450         </screen>
1451       </sect2>
1452
1453       <sect2>
1454         <title>Memory (reading, writing, typing)</title>
1455
1456         <screen>
1457 x &lt;expr&gt;  examines memory at &lt;expr&gt; address
1458 x /fmt &lt;expr&gt;     examines memory at &lt;expr&gt; address using format /fmt
1459 print &lt;expr&gt;      prints the value of &lt;expr&gt; (possibly using its type)
1460 print /fmt &lt;expr&gt; prints the value of &lt;expr&gt; (possibly using its
1461                 type) 
1462 set &lt;lval&gt;=&lt;expr&gt;   writes the value of &lt;expr&gt; in &lt;lval&gt; 
1463 whatis &lt;expr&gt;     prints the C type of expression &lt;expr&gt;
1464         </screen>
1465         <para>
1466           <filename>/fmt</filename> is either <filename>/&lt;letter&gt;</filename> or
1467           <filename>/&lt;count&gt;&lt;letter&gt;</filename> letter can be       
1468         </para>
1469         <screen>
1470 s =&gt; an ASCII string
1471 u =&gt; an Unicode UTF16 string
1472 i =&gt; instructions (disassemble)
1473 x =&gt; 32 bit unsigned hexadecimal integer
1474 d =&gt; 32 bit signed decimal integer
1475 w =&gt; 16 bit unsigned hexadecimal integer
1476 c =&gt; character (only printable 0x20-0x7f are actually
1477      printed) 
1478 b =&gt; 8 bit unsigned hexadecimal integer
1479         </screen>
1480       </sect2>
1481
1482       <sect2>
1483         <title>Expressions</title>
1484         
1485         <para>
1486           Expressions in Wine Debugger are mostly written in a C form. However, there
1487           are a few discrepancies:
1488           <itemizedlist>
1489             <listitem>
1490               <para>
1491                 Identifiers can take a '.' in their names. This allow mainly to access symbols
1492                 from different DLLs like USER32.DLL.CreateWindowA
1493               </para>
1494             </listitem>
1495             <listitem>
1496               <para>
1497                 Because of previous rule, fields access from a struct must be written as:
1498 <screen>
1499         my_struct . my_field    
1500 </screen>
1501                 (note the spaces after and before the dot).
1502               </para>
1503             </listitem>
1504           </itemizedlist>
1505         </para>
1506       </sect2>
1507
1508     </sect1>
1509
1510
1511     <sect1 id="dbg-others">
1512       <title>Other debuggers</title>
1513
1514       <sect2>
1515         <title>Using other Unix debuggers</title>
1516
1517         <para>
1518           You can also use other debuggers (like
1519           <command>gdb</command>), but you must be aware of a few
1520           items:
1521         </para>
1522         <para>
1523           You need to attach the unix debugger to the correct unix
1524           process (representing the correct windows thread) (you can
1525           "guess" it from a <command>ps fax</command> for example:
1526           When running the emulator, usually the first two
1527           <varname>upids</varname> are for the Windows' application
1528           running the desktop, the first thread of the application is
1529           generally the third <varname>upid</varname>; when running a
1530           Winelib program, the first thread of the application is
1531           generally the first <varname>upid</varname>)
1532         </para>
1533         <note>
1534           <para>
1535             Even if latest <command>gdb</command> implements the
1536             notion of threads, it won't work with Wine because the
1537             thread abstraction used for implementing Windows' thread
1538             is not 100% mapped onto the linux posix threads
1539             implementation. It means that you'll have to spawn a
1540             different <command>gdb</command> session for each Windows'
1541             thread you wish to debug.
1542           </para>
1543         </note>
1544
1545         <!-- *** Extra content spliced in from article by Andreas Mohr *** -->
1546         <para>
1547           Following text written by &name-andreas-mohr; <email>&email-andreas-mohr;</email>
1548         </para>
1549         <para>
1550           Here's how to get info about the current execution status of a
1551           certain Wine process:
1552         </para>
1553         <para>
1554           Change into your Wine source dir and enter:
1555         </para>
1556         <screen>
1557 $ gdb wine
1558         </screen>
1559         <para>
1560           Switch to another console and enter <command>ps ax | grep
1561             wine</command> to find all wine processes. Inside
1562           <command>gdb</command>, repeat for all Wine processes:
1563         </para>
1564         <screen>
1565 (gdb) attach <userinput>PID</userinput>
1566         </screen>
1567         <para>
1568           with <userinput>PID</userinput> being the process ID of one of
1569           the Wine processes.  Use
1570         </para>
1571         <screen>
1572 (gdb) bt
1573         </screen>
1574         <para>
1575           to get the backtrace of the current Wine process, i.e. the
1576           function call history.  That way you can find out what the
1577           current process is doing right now.  And then you can use
1578           several times:
1579         </para>
1580         <screen>
1581 (gdb) n
1582         </screen>
1583         <para>
1584           or maybe even
1585         </para>
1586         <screen>
1587 (gdb) b <userinput>SomeFunction</userinput>
1588         </screen>
1589         <para>
1590           and
1591         </para>
1592         <screen>
1593 (gdb) c
1594         </screen>
1595         <para>
1596           to set a breakpoint at a certain function and continue up to
1597           that function.  Finally you can enter
1598         </para>
1599         <screen>
1600 (gdb) detach
1601         </screen>
1602         <para>
1603           to detach from the Wine process.
1604         </para>
1605         <!-- *** End of xtra content *** -->
1606       </sect2>
1607
1608       <sect2>
1609         <title>Using other Windows debuggers</title>
1610
1611         <para>
1612           You can use any Windows' debugging API compliant debugger
1613           with Wine. Some reports have been made of success with
1614           VisualStudio debugger (in remote mode, only the hub runs
1615           in Wine). GoVest fully runs in Wine.
1616         </para>
1617       </sect2>
1618
1619       <sect2>
1620         <title>Main differences between winedbg and regular Unix debuggers</title>
1621
1622         <!-- FIXME: convert this into a table -->
1623         <screen>
1624 +----------------------------------+---------------------------------+
1625 |             WineDbg              |                 gdb             |
1626 +----------------------------------+---------------------------------+
1627 |WineDbg debugs a Windows' process:|gdb debugs a Windows' thread:    |
1628 |+ the various threads will be     |+ a separate gdb session is      |
1629 |  handled by the same WineDbg     |  needed for each thread of      |
1630 | session                          |  Windows' process               |
1631 |+ a breakpoint will be triggered  |+ a breakpoint will be triggered |
1632 |  for any thread of the w-process |  only for the w-thread debugged |
1633 +----------------------------------+---------------------------------+
1634 |WineDbg supports debug information|gdb supports debug information   |
1635 |from:                             |from:                            |
1636 |+ stabs (standard Unix format)    |+ stabs (standard Unix format)   |
1637 |+ Microsoft's C, CodeView, .DBG   |                                 |
1638 +----------------------------------+---------------------------------+
1639         </screen>
1640       </sect2>
1641     </sect1>
1642
1643
1644     <sect1 id="dbg-limits">
1645       <title>Limitations</title>
1646
1647       <para>
1648         16 bit processes are not supported (but calls to 16 bit code
1649         in 32 bit  applications are).
1650       </para>
1651
1652     </sect1>
1653   </chapter>
1654
1655 <!-- Keep this comment at the end of the file
1656 Local variables:
1657 mode: sgml
1658 sgml-parent-document:("wine-doc.sgml" "set" "book" "part" "chapter" "")
1659 End:
1660 -->