Release 950727
[wine] / debugger / stack.c
1 /*
2  * Debugger stack handling
3  *
4  * Copyright 1995 Alexandre Julliard
5  */
6
7 #include <stdio.h>
8 #include "windows.h"
9 #include "debugger.h"
10
11
12 typedef struct
13 {
14     WORD bp;
15     WORD ip;
16     WORD cs;
17 } FRAME16;
18
19 typedef struct
20 {
21     DWORD bp;
22     DWORD ip;
23     WORD cs;
24 } FRAME32;
25
26
27
28 /***********************************************************************
29  *           DEBUG_InfoStack
30  *
31  * Dump the top of the stack
32  */
33 void DEBUG_InfoStack(void)
34 {
35     fprintf(stderr,"Stack dump:\n");
36     if ((SS == WINE_DATA_SELECTOR) ||
37         (GET_SEL_FLAGS(SS) & LDT_FLAGS_32BIT))  /* 32-bit mode */
38     {
39         examine_memory( 0, ESP, 10, 'x' );
40     }
41     else  /* 16-bit mode */
42     {
43         examine_memory( SS, SP, 10, 'w' );
44     }
45     fprintf(stderr,"\n");
46 }
47
48
49 /***********************************************************************
50  *           DEBUG_BackTrace
51  *
52  * Display a stack back-trace.
53  */
54 void DEBUG_BackTrace(void)
55 {
56   int frameno = 0;
57
58   fprintf(stderr,"Backtrace:\n");
59   if (SS == WINE_DATA_SELECTOR)  /* 32-bit mode */
60   {
61       FRAME32 *frame = (FRAME32 *)EBP;
62       while (frame->ip)
63       {
64           fprintf(stderr,"%d ",frameno++);
65           print_address( 0, frame->ip, 32 );
66           fprintf( stderr, "\n" );
67           frame = (FRAME32 *)frame->bp;
68       }
69   }
70   else  /* 16-bit mode */
71   {
72       FRAME16 *frame = (FRAME16 *)PTR_SEG_OFF_TO_LIN( SS, BP & ~1 );
73       WORD cs = CS;
74       if (GET_SEL_FLAGS(SS) & LDT_FLAGS_32BIT)
75       {
76           fprintf( stderr, "Not implemented: 32-bit backtrace on a different stack segment.\n" );
77           return;
78       }
79       while (frame->bp)
80       {
81           if (frame->bp & 1) cs = frame->cs;
82           fprintf( stderr,"%d ", frameno++ );
83           print_address( cs, frame->ip, 16 );
84           fprintf( stderr, "\n" );
85           frame = (FRAME16 *)PTR_SEG_OFF_TO_LIN( SS, frame->bp & ~1 );
86       }
87   }
88   fprintf( stderr, "\n" );
89 }