forked from dlang/dlang.org
-
Notifications
You must be signed in to change notification settings - Fork 0
/
windbg.dd
182 lines (129 loc) · 3.3 KB
/
windbg.dd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
Ddoc
$(D_S Debugging D on Windows,
$(P The Microsoft Windows debugger $(D $(DMDDIR)\windows\bin\windbg.exe) can be used to
symbolically debug D programs, even though it is a C++ debugger.
Versions of $(D windbg.exe) other than the one supplied may not work with D.
(Jascha Wetzel's $(LINK2 http://ddbg.mainia.de/releases.html, Ddbg for Windows)
is also available.)
)
$(P To prepare a program for symbolic debugging, compile
with the $(B -gc) switch:
)
$(CONSOLE
dmd myprogram -gc
)
$(P To invoke the debugger on it:
)
$(CONSOLE
windbg myprogram args...
)
$(P
where $(D args...) are the command line arguments to myprogram.exe.
)
$(P When the debugger comes up, entering the command in the command window:)
$(CONSOLE
g _Dmain
)
$(P will execute the program up until the entry into $(D main()).
From thence, pressing the $(B F10) key will single step each line
of code.)
$(P Basic Commands:)
$(DL
$(DT F5)
$(DD Go until breakpoint, an exception is thrown, or the end of the program.)
$(DT F7)
$(DD Continue until cursor.)
$(DT F8)
$(DD Single step, stepping into function calls.)
$(DT F10)
$(DD Single step, stepping over function calls.)
)
$(P For more comprehensive information on $(B windbg), consult the
file $(D $(DMDDIR)\windows\bin\windbg.hlp).
)
$(COMMENT
$(H2 Sample Debug Session)
$(P This is a walkthrough of a typical debugging session. Given the program:)
----------
import std.stdio;
class Foo
{
int x;
}
int main()
{
Foo p;
bar(p);
}
void bar(Foo p)
{
abc(p);
}
void abc(Foo p)
{
p.x++;
}
---------
$(P It is compiled and run with the following commands:)
$(CONSOLE
C:\bug>dmd bug -g
\dm\bin\link bug,,,user32+kernel32/co/noi;
C:\bug>bug
Error: Access Violation
C:\bug>
)
$(P It's obviously got a bug, so fire up the debugger with:)
$(CONSOLE
C:\bug>windbg bug.exe
)
$(P and the debugger window comes up:)
<img src="foo.bmp">
$(P Advance to the beginning of $(D main()) by entering $(D g _Dmain):)
<img src="windbg2.gif">
$(P now were at the beginning of main(). The upper left black window shows
the console output so far, the middle window shows the current location
and next instruction (the $(D xor)), The lower right window shows the
current location in the source code, highlighted in yellow.)
$(P In order to run until the exception happens, use the $(D g) command:)
<img src="windbg3.gif">
$(P The $(D First chance exception) says an exception was thrown. The
lower right window now shows the line on which the exception happened
highlighted in yellow.)
$(P Now click on the [Window] menu and Select [Calls]:)
<img src="windbg4.gif">
$(P and a window will appear showing the call stack:)
<img src="windbg6.gif">
$(P Clicking on the [Disassembly] command brings up
the Disassembly window where the instruction that faulted is highlighted
in yellow. Clicking on the [Registers] command brings up
the register window, where EAX holds the value 00000000.)
<img src="windbg7.gif">
$(P The trouble is clearly that $(D p) is $(D null). Fix it by allocating
an instance for $(D p):)
----------
import std.stdio;
class Foo
{
int x;
}
int main()
{
Foo p = new Foo; // the fix
bar(p);
}
void bar(Foo p)
{
abc(p);
}
void abc(Foo p)
{
p.x++;
}
---------
$(P and it should now compile and run without error.)
)
)
Macros:
TITLE=windbg Debugger
DMDDIR=\dmd2
_=