annotate dbg/CallStackInfo.d @ 135:af1bebfd96a4 dmd2037

dmd 2.038
author Eldar Insafutdinov <e.insafutdinov@gmail.com>
date Mon, 13 Sep 2010 22:19:42 +0100
parents 43073c7c7769
children a4c9de8e39b3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
1 /**
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
2 A simple runtime crash handler which collects various informations about
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
3 the crash such as registers, stack traces, and loaded modules.
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
4
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
5 TODO:
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
6 * Threading support
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
7 * Stack dumps
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
8
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
9 Authors:
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
10 Jeremie Pelletier
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
11
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
12 License:
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
13 Public Domain
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
14 */
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
15 module dbg.CallStackInfo;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
16
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
17 import dbg.Debug;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
18 import dbg.image.PE;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
19
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
20 import core.stdc.stdio;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
21 import core.sys.windows.windows;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
22
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
23 class CallStackInfo
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
24 {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
25 this(EXCEPTION_POINTERS* e = null)
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
26 {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
27 size_t[16] buff;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
28 size_t[] backtrace = buff[];
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
29 size_t numTraces = 0;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
30
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
31 bool skipFirst = false;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
32
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
33 size_t ip = void, bp = void;
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
34 version(Windows) {
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
35 if (e !is null) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
36 ip = e.ContextRecord.Eip;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
37 bp = e.ContextRecord.Ebp;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
38
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
39 error = _d_translate_se_to_d_exception(e.ExceptionRecord);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
40 append(backtrace, numTraces, ip);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
41 } else {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
42 asm {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
43 mov bp, EBP;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
44 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
45 }
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
46 }
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
47
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
48 while (true) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
49 ip = cast(size_t)*(cast(void**)bp + 1);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
50 if (ip == 0) break;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
51
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
52 append(backtrace, numTraces, ip);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
53
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
54 bp = cast(size_t)*cast(void**)bp;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
55 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
56
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
57 frames = new StackFrameInfo[numTraces];
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
58 ResolveStackFrames(backtrace[0..numTraces], frames);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
59 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
60
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
61 Throwable error;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
62 StackFrameInfo[] frames;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
63
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
64 override string toString()
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
65 {
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
66 string text;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
67
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
68 if (error !is null) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
69 text ~= error.toString() ~ "\n";
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
70 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
71
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
72 text ~= "Stack trace:\n------------------\n";
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
73 char buffer[128];
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
74 foreach(ref frame; frames)
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
75 {
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
76 with(frame.fileLine) if(line)
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
77 {
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
78 auto len = snprintf(buffer.ptr, buffer.length, "%u", line);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
79 text ~= file ~ ":" ~ buffer[0 .. len] ~ "\r\n";
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
80 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
81 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
82
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
83 text ~= '\0';
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
84
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
85 return text;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
86 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
87
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
88 void dump()
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
89 {
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
90 if (error !is null) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
91 printf("%.*s\n", error.toString());
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
92 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
93
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
94 printf("Stack trace:\n------------------\n");
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
95 foreach(ref frame; frames) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
96 with(frame.fileLine) if (line) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
97 printf("%.*s:%d\r\n", file, line);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
98 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
99 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
100 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
101
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
102 private:
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
103
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
104 struct StackFrameInfo {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
105 size_t va;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
106 string moduleName;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
107 SymbolInfo symbol;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
108 FileLineInfo fileLine;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
109 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
110
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
111 struct DebugImage {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
112 DebugImage* next;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
113 string moduleName;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
114 size_t baseAddress;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
115 uint rvaOffset;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
116 IExecutableImage exeModule;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
117 ISymbolicDebugInfo debugInfo;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
118 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
119
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
120 void ResolveStackFrames(size_t[] backtrace, StackFrameInfo[] frames) const {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
121 StackFrameInfo* frame = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
122 DebugImage* imageList, image = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
123 char[255] buffer = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
124 uint len = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
125 uint rva = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
126
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
127 version(Windows) MEMORY_BASIC_INFORMATION mbi = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
128
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
129 foreach(i, va; backtrace) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
130 frame = &frames[i];
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
131 frame.va = va;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
132
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
133 version(Windows) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
134 // mbi.Allocation base is the handle to stack frame's module
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
135 VirtualQuery(cast(void*)va, &mbi, MEMORY_BASIC_INFORMATION.sizeof);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
136 if(!mbi.AllocationBase) break;
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
137
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
138 image = imageList;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
139 while(image) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
140 if(image.baseAddress == cast(size_t)mbi.AllocationBase) break;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
141 image = image.next;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
142 }
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
143
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
144 if(!image) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
145 image = new DebugImage;
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
146
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
147 with(*image) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
148 next = imageList;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
149 imageList = image;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
150 baseAddress = cast(size_t)mbi.AllocationBase;
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
151
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
152 len = GetModuleFileNameA(cast(HMODULE)baseAddress, buffer.ptr, buffer.length);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
153 moduleName = buffer[0 .. len].idup;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
154 if (len != 0) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
155 exeModule = new PEImage(moduleName);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
156 rvaOffset = baseAddress + exeModule.codeOffset;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
157 debugInfo = exeModule.debugInfo;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
158 }
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
159 }
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
160 }
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
161 }
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
162 else version(POSIX)
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
163 {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
164 assert(0);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
165 }
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
166 else static assert(0);
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
167
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
168 frame.moduleName = image.moduleName;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
169
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
170 if(!image.debugInfo) continue;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
171
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
172 rva = va - image.rvaOffset;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
173
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
174 with(image.debugInfo) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
175 frame.symbol = ResolveSymbol(rva);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
176 frame.fileLine = ResolveFileLine(rva);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
177 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
178 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
179
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
180 while(imageList) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
181 image = imageList.next;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
182 delete imageList.debugInfo;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
183 delete imageList.exeModule;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
184 delete imageList;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
185 imageList = image;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
186 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
187 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
188 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
189
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
190 void CrashHandlerInit() {
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
191 version(Windows) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
192 //SetErrorMode(SetErrorMode(0) | SEM_FAILCRITICALERRORS);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
193 SetErrorMode(0);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
194 SetUnhandledExceptionFilter(&UnhandledExceptionHandler);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
195 }
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
196 else version(Posix) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
197 assert(0);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
198 /+ sigaction_t sa;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
199 sa.sa_handler = cast(sighandler_t)&SignalHandler;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
200 sigemptyset(&sa.sa_mask);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
201 sa.sa_flags = SA_RESTART | SA_SIGINFO;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
202
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
203 sigaction(SIGILL, &sa, null);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
204 sigaction(SIGFPE, &sa, null);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
205 sigaction(SIGSEGV, &sa, null);+/
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
206 }
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
207 else static assert(0);
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
208 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
209 enum EXCEPTION_EXECUTE_HANDLER = 1;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
210
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
211 extern(Windows) int UnhandledExceptionHandler(EXCEPTION_POINTERS* e) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
212 scope CallStackInfo info = new CallStackInfo(e);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
213 info.dump();
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
214
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
215 return EXCEPTION_EXECUTE_HANDLER;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
216 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
217
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
218 extern (Windows) extern UINT SetErrorMode(UINT);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
219 alias LONG function(EXCEPTION_POINTERS*) PTOP_LEVEL_EXCEPTION_FILTER;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
220 extern (Windows) PTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(PTOP_LEVEL_EXCEPTION_FILTER);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
221
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 70
diff changeset
222 void append(T)(ref T[] array, ref size_t index, T value)
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
223 {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
224 size_t capacity = array.length;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
225 assert(capacity >= index);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
226 if (capacity == index) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
227 if (capacity < 8) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
228 capacity = 8;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
229 } else {
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 70
diff changeset
230 capacity *= 2;
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
231 }
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 70
diff changeset
232
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 70
diff changeset
233 array.length = capacity;
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
234 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
235
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
236 array[index++] = value;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
237 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
238
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
239 struct EXCEPTION_POINTERS {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
240 EXCEPTION_RECORD* ExceptionRecord;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
241 CONTEXT* ContextRecord;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
242 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
243
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
244 const size_t EXCEPTION_MAXIMUM_PARAMETERS = 15;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
245
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
246 struct EXCEPTION_RECORD {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
247 DWORD ExceptionCode;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
248 DWORD ExceptionFlags;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
249 EXCEPTION_RECORD* ExceptionRecord;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
250 PVOID ExceptionAddress;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
251 DWORD NumberParameters;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
252 DWORD[EXCEPTION_MAXIMUM_PARAMETERS] ExceptionInformation;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
253 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
254
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
255 const MAXIMUM_SUPPORTED_EXTENSION = 512;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
256
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
257 struct CONTEXT {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
258 DWORD ContextFlags;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
259 DWORD Dr0;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
260 DWORD Dr1;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
261 DWORD Dr2;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
262 DWORD Dr3;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
263 DWORD Dr6;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
264 DWORD Dr7;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
265 FLOATING_SAVE_AREA FloatSave;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
266 DWORD SegGs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
267 DWORD SegFs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
268 DWORD SegEs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
269 DWORD SegDs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
270 DWORD Edi;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
271 DWORD Esi;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
272 DWORD Ebx;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
273 DWORD Edx;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
274 DWORD Ecx;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
275 DWORD Eax;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
276 DWORD Ebp;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
277 DWORD Eip;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
278 DWORD SegCs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
279 DWORD EFlags;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
280 DWORD Esp;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
281 DWORD SegSs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
282 BYTE[MAXIMUM_SUPPORTED_EXTENSION] ExtendedRegisters;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
283 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
284
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
285 extern(C) Throwable _d_translate_se_to_d_exception(EXCEPTION_RECORD* exception_record);