Release 951003
[wine/hacks.git] / debugger / stack.c
blobbe7fb9b10371f1f37d6a0c81770becce600ff4ee
1 /*
2 * Debugger stack handling
4 * Copyright 1995 Alexandre Julliard
5 */
7 #include <stdio.h>
8 #include "windows.h"
9 #include "debugger.h"
12 typedef struct
14 WORD bp;
15 WORD ip;
16 WORD cs;
17 } FRAME16;
19 typedef struct
21 DWORD bp;
22 DWORD ip;
23 WORD cs;
24 } FRAME32;
28 /***********************************************************************
29 * DEBUG_InfoStack
31 * Dump the top of the stack
33 void DEBUG_InfoStack(void)
35 DBG_ADDR addr;
37 fprintf(stderr,"Stack dump:\n");
38 if ((SS_reg(DEBUG_context) == WINE_DATA_SELECTOR) ||
39 (GET_SEL_FLAGS(SS_reg(DEBUG_context)) & LDT_FLAGS_32BIT))
40 { /* 32-bit mode */
41 addr.seg = 0;
42 addr.off = ESP_reg(DEBUG_context);
43 DEBUG_ExamineMemory( &addr, 10, 'x' );
45 else /* 16-bit mode */
47 addr.seg = SS_reg(DEBUG_context);
48 addr.off = SP_reg(DEBUG_context);
49 DEBUG_ExamineMemory( &addr, 10, 'w' );
51 fprintf(stderr,"\n");
55 /***********************************************************************
56 * DEBUG_BackTrace
58 * Display a stack back-trace.
60 void DEBUG_BackTrace(void)
62 DBG_ADDR addr;
63 int frameno = 0;
65 fprintf(stderr,"Backtrace:\n");
66 if (SS_reg(DEBUG_context) == WINE_DATA_SELECTOR) /* 32-bit mode */
68 addr.seg = 0;
69 addr.off = EBP_reg(DEBUG_context);
70 for (;;)
72 FRAME32 *frame = (FRAME32 *)addr.off;
73 if (!DBG_CHECK_READ_PTR( &addr, sizeof(FRAME32) )) return;
74 if (!frame->ip) break;
75 fprintf(stderr,"%d ",frameno++);
76 addr.off = frame->ip;
77 DEBUG_PrintAddress( &addr, 32 );
78 fprintf( stderr, "\n" );
79 addr.off = frame->bp;
82 else /* 16-bit mode */
84 WORD ss = SS_reg(DEBUG_context), cs = CS_reg(DEBUG_context);
85 if (GET_SEL_FLAGS(ss) & LDT_FLAGS_32BIT)
87 fprintf( stderr, "Not implemented: 32-bit backtrace on a different stack segment.\n" );
88 return;
90 addr.seg = SS_reg(DEBUG_context);
91 addr.off = BP_reg(DEBUG_context) & ~1;
92 for (;;)
94 FRAME16 *frame = (FRAME16 *)DBG_ADDR_TO_LIN(&addr);
95 if (!DBG_CHECK_READ_PTR( &addr, sizeof(FRAME16) )) return;
96 if (!frame->bp) break;
97 if (frame->bp & 1) cs = frame->cs;
98 fprintf( stderr,"%d ", frameno++ );
99 addr.seg = cs;
100 addr.off = frame->ip;
101 DEBUG_PrintAddress( &addr, 16 );
102 fprintf( stderr, "\n" );
103 addr.seg = ss;
104 addr.off = frame->bp & ~1;
107 fprintf( stderr, "\n" );