annotate dbg/CallStackInfo.d @ 74:7e0d548de9e6

Switch Arrays of Dsymbols to the new templated Vector type
author Eldar Insafutdinov <e.insafutdinov@gmail.com>
date Sun, 29 Aug 2010 09:43:40 +0100
parents ef02e2e203c2
children 43073c7c7769
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
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
64 string toString() {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
65 string text;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
66
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
67 if (error !is null) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
68 text ~= error.toString() ~ "\n";
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
69 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
71 text ~= "Stack trace:\n------------------\n";
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
72 char buffer[128];
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
73 foreach(ref frame; frames) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
74 with(frame.fileLine) if(line) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
75 auto len = snprintf(buffer.ptr, buffer.length, "%u", line);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
76 text ~= file ~ ":" ~ buffer[0 .. len] ~ "\r\n";
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
77 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
78 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
79
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
80 text ~= '\0';
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
81
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
82 return text;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
83 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
84
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
85 void dump() {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
86 if (error !is null) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
87 printf("%.*s\n", error.toString());
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
88 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
89
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
90 printf("Stack trace:\n------------------\n");
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
91 foreach(ref frame; frames) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
92 with(frame.fileLine) if (line) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
93 printf("%.*s:%d\r\n", file, line);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
94 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
95 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
96 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
97
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
98 private:
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
99
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
100 struct StackFrameInfo {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
101 size_t va;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
102 string moduleName;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
103 SymbolInfo symbol;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
104 FileLineInfo fileLine;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
105 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
106
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
107 struct DebugImage {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
108 DebugImage* next;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
109 string moduleName;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
110 size_t baseAddress;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
111 uint rvaOffset;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
112 IExecutableImage exeModule;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
113 ISymbolicDebugInfo debugInfo;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
114 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
115
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
116 void ResolveStackFrames(size_t[] backtrace, StackFrameInfo[] frames) const {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
117 StackFrameInfo* frame = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
118 DebugImage* imageList, image = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
119 char[255] buffer = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
120 uint len = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
121 uint rva = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
122
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
123 version(Windows) MEMORY_BASIC_INFORMATION mbi = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
124
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
125 foreach(i, va; backtrace) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
126 frame = &frames[i];
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
127 frame.va = va;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
128
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
129 version(Windows) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
130 // 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
131 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
132 if(!mbi.AllocationBase) break;
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
133
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
134 image = imageList;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
135 while(image) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
136 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
137 image = image.next;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
138 }
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
139
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
140 if(!image) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
141 image = new DebugImage;
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
142
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
143 with(*image) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
144 next = imageList;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
145 imageList = image;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
146 baseAddress = cast(size_t)mbi.AllocationBase;
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
147
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
148 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
149 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
150 if (len != 0) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
151 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
152 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
153 debugInfo = exeModule.debugInfo;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
154 }
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
155 }
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
156 }
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
157 }
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
158 else version(POSIX)
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 assert(0);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
161 }
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
162 else static assert(0);
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
163
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
164 frame.moduleName = image.moduleName;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
165
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
166 if(!image.debugInfo) continue;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
167
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
168 rva = va - image.rvaOffset;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
169
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
170 with(image.debugInfo) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
171 frame.symbol = ResolveSymbol(rva);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
172 frame.fileLine = ResolveFileLine(rva);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
173 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
174 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
175
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
176 while(imageList) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
177 image = imageList.next;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
178 delete imageList.debugInfo;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
179 delete imageList.exeModule;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
180 delete imageList;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
181 imageList = image;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
182 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
183 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
184 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
185
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
186 void CrashHandlerInit() {
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
187 version(Windows) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
188 //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
189 SetErrorMode(0);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
190 SetUnhandledExceptionFilter(&UnhandledExceptionHandler);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
191 }
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
192 else version(Posix) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
193 assert(0);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
194 /+ sigaction_t sa;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
195 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
196 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
197 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
198
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
199 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
200 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
201 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
202 }
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
203 else static assert(0);
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
204 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
205 enum EXCEPTION_EXECUTE_HANDLER = 1;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
206
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
207 extern(Windows) int UnhandledExceptionHandler(EXCEPTION_POINTERS* e) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
208 scope CallStackInfo info = new CallStackInfo(e);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
209 info.dump();
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
210
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
211 return EXCEPTION_EXECUTE_HANDLER;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
212 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
213
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
214 extern (Windows) extern UINT SetErrorMode(UINT);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
215 alias LONG function(EXCEPTION_POINTERS*) PTOP_LEVEL_EXCEPTION_FILTER;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
216 extern (Windows) PTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(PTOP_LEVEL_EXCEPTION_FILTER);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
217
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 70
diff changeset
218 void append(T)(ref T[] array, ref size_t index, T value)
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
219 {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
220 size_t capacity = array.length;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
221 assert(capacity >= index);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
222 if (capacity == index) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
223 if (capacity < 8) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
224 capacity = 8;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
225 } else {
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 70
diff changeset
226 capacity *= 2;
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
227 }
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 70
diff changeset
228
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 70
diff changeset
229 array.length = capacity;
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
230 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
231
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
232 array[index++] = value;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
233 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
234
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
235 struct EXCEPTION_POINTERS {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
236 EXCEPTION_RECORD* ExceptionRecord;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
237 CONTEXT* ContextRecord;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
238 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
239
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
240 const size_t EXCEPTION_MAXIMUM_PARAMETERS = 15;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
241
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
242 struct EXCEPTION_RECORD {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
243 DWORD ExceptionCode;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
244 DWORD ExceptionFlags;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
245 EXCEPTION_RECORD* ExceptionRecord;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
246 PVOID ExceptionAddress;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
247 DWORD NumberParameters;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
248 DWORD[EXCEPTION_MAXIMUM_PARAMETERS] ExceptionInformation;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
249 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
250
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
251 const MAXIMUM_SUPPORTED_EXTENSION = 512;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
252
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
253 struct CONTEXT {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
254 DWORD ContextFlags;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
255 DWORD Dr0;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
256 DWORD Dr1;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
257 DWORD Dr2;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
258 DWORD Dr3;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
259 DWORD Dr6;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
260 DWORD Dr7;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
261 FLOATING_SAVE_AREA FloatSave;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
262 DWORD SegGs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
263 DWORD SegFs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
264 DWORD SegEs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
265 DWORD SegDs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
266 DWORD Edi;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
267 DWORD Esi;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
268 DWORD Ebx;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
269 DWORD Edx;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
270 DWORD Ecx;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
271 DWORD Eax;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
272 DWORD Ebp;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
273 DWORD Eip;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
274 DWORD SegCs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
275 DWORD EFlags;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
276 DWORD Esp;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
277 DWORD SegSs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
278 BYTE[MAXIMUM_SUPPORTED_EXTENSION] ExtendedRegisters;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
279 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
280
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
281 extern(C) Throwable _d_translate_se_to_d_exception(EXCEPTION_RECORD* exception_record);