annotate dbg/CallStackInfo.d @ 189:a4c9de8e39b3

Now compileable with dmd2.053
author Abscissa
date Wed, 08 Jun 2011 02:21:32 -0400
parents 43073c7c7769
children 52188e7e3fb5
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
189
a4c9de8e39b3 Now compileable with dmd2.053
Abscissa
parents: 79
diff changeset
23 import rt.deh;
a4c9de8e39b3 Now compileable with dmd2.053
Abscissa
parents: 79
diff changeset
24
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
25 class CallStackInfo
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
26 {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
27 this(EXCEPTION_POINTERS* e = null)
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
28 {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
29 size_t[16] buff;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
30 size_t[] backtrace = buff[];
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
31 size_t numTraces = 0;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
32
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
33 bool skipFirst = false;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
34
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
35 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
36 version(Windows) {
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
37 if (e !is null) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
38 ip = e.ContextRecord.Eip;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
39 bp = e.ContextRecord.Ebp;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
40
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
41 error = _d_translate_se_to_d_exception(e.ExceptionRecord);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
42 append(backtrace, numTraces, ip);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
43 } else {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
44 asm {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
45 mov bp, EBP;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
46 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
47 }
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
48 }
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
49
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
50 while (true) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
51 ip = cast(size_t)*(cast(void**)bp + 1);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
52 if (ip == 0) break;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
53
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
54 append(backtrace, numTraces, ip);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
55
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
56 bp = cast(size_t)*cast(void**)bp;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
57 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
58
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
59 frames = new StackFrameInfo[numTraces];
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
60 ResolveStackFrames(backtrace[0..numTraces], frames);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
61 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
62
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
63 Throwable error;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
64 StackFrameInfo[] frames;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
65
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
66 override string toString()
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
67 {
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
68 string text;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
69
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
70 if (error !is null) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
71 text ~= error.toString() ~ "\n";
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
72 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
73
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
74 text ~= "Stack trace:\n------------------\n";
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
75 char buffer[128];
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
76 foreach(ref frame; frames)
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
77 {
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
78 with(frame.fileLine) if(line)
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
79 {
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
80 auto len = snprintf(buffer.ptr, buffer.length, "%u", line);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
81 text ~= file ~ ":" ~ buffer[0 .. len] ~ "\r\n";
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
82 }
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 text ~= '\0';
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
86
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
87 return text;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
88 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
89
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
90 void dump()
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
91 {
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
92 if (error !is null) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
93 printf("%.*s\n", error.toString());
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 printf("Stack trace:\n------------------\n");
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
97 foreach(ref frame; frames) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
98 with(frame.fileLine) if (line) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
99 printf("%.*s:%d\r\n", file, line);
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 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
103
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
104 private:
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
105
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
106 struct StackFrameInfo {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
107 size_t va;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
108 string moduleName;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
109 SymbolInfo symbol;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
110 FileLineInfo fileLine;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
111 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
112
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
113 struct DebugImage {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
114 DebugImage* next;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
115 string moduleName;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
116 size_t baseAddress;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
117 uint rvaOffset;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
118 IExecutableImage exeModule;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
119 ISymbolicDebugInfo debugInfo;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
120 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
121
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
122 void ResolveStackFrames(size_t[] backtrace, StackFrameInfo[] frames) const {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
123 StackFrameInfo* frame = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
124 DebugImage* imageList, image = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
125 char[255] buffer = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
126 uint len = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
127 uint rva = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
128
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
129 version(Windows) MEMORY_BASIC_INFORMATION mbi = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
130
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
131 foreach(i, va; backtrace) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
132 frame = &frames[i];
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
133 frame.va = va;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
134
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
135 version(Windows) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
136 // 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
137 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
138 if(!mbi.AllocationBase) break;
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 image = imageList;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
141 while(image) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
142 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
143 image = image.next;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
144 }
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
145
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
146 if(!image) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
147 image = new DebugImage;
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
148
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
149 with(*image) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
150 next = imageList;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
151 imageList = image;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
152 baseAddress = cast(size_t)mbi.AllocationBase;
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
153
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
154 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
155 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
156 if (len != 0) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
157 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
158 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
159 debugInfo = exeModule.debugInfo;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
160 }
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 }
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
163 }
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
164 else version(POSIX)
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 assert(0);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
167 }
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
168 else static assert(0);
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
169
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
170 frame.moduleName = image.moduleName;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
171
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
172 if(!image.debugInfo) continue;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
173
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
174 rva = va - image.rvaOffset;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
175
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
176 with(image.debugInfo) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
177 frame.symbol = ResolveSymbol(rva);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
178 frame.fileLine = ResolveFileLine(rva);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
179 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
180 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
181
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
182 while(imageList) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
183 image = imageList.next;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
184 delete imageList.debugInfo;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
185 delete imageList.exeModule;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
186 delete imageList;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
187 imageList = image;
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 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
191
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
192 void CrashHandlerInit() {
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
193 version(Windows) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
194 //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
195 SetErrorMode(0);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
196 SetUnhandledExceptionFilter(&UnhandledExceptionHandler);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
197 }
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
198 else version(Posix) {
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
199 assert(0);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
200 /+ sigaction_t sa;
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
201 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
202 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
203 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
204
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
205 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
206 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
207 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
208 }
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
209 else static assert(0);
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
210 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
211 enum EXCEPTION_EXECUTE_HANDLER = 1;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
212
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
213 extern(Windows) int UnhandledExceptionHandler(EXCEPTION_POINTERS* e) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
214 scope CallStackInfo info = new CallStackInfo(e);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
215 info.dump();
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
216
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
217 return EXCEPTION_EXECUTE_HANDLER;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
218 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
219
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
220 extern (Windows) extern UINT SetErrorMode(UINT);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
221 alias LONG function(EXCEPTION_POINTERS*) PTOP_LEVEL_EXCEPTION_FILTER;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
222 extern (Windows) PTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(PTOP_LEVEL_EXCEPTION_FILTER);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
223
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 70
diff changeset
224 void append(T)(ref T[] array, ref size_t index, T value)
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
225 {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
226 size_t capacity = array.length;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
227 assert(capacity >= index);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
228 if (capacity == index) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
229 if (capacity < 8) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
230 capacity = 8;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
231 } else {
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 70
diff changeset
232 capacity *= 2;
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
233 }
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 70
diff changeset
234
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 70
diff changeset
235 array.length = capacity;
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
236 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
237
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
238 array[index++] = value;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
239 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
240
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
241 struct EXCEPTION_POINTERS {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
242 EXCEPTION_RECORD* ExceptionRecord;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
243 CONTEXT* ContextRecord;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
244 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
245
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
246 const MAXIMUM_SUPPORTED_EXTENSION = 512;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
247
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
248 struct CONTEXT {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
249 DWORD ContextFlags;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
250 DWORD Dr0;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
251 DWORD Dr1;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
252 DWORD Dr2;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
253 DWORD Dr3;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
254 DWORD Dr6;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
255 DWORD Dr7;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
256 FLOATING_SAVE_AREA FloatSave;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
257 DWORD SegGs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
258 DWORD SegFs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
259 DWORD SegEs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
260 DWORD SegDs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
261 DWORD Edi;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
262 DWORD Esi;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
263 DWORD Ebx;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
264 DWORD Edx;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
265 DWORD Ecx;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
266 DWORD Eax;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
267 DWORD Ebp;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
268 DWORD Eip;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
269 DWORD SegCs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
270 DWORD EFlags;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
271 DWORD Esp;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
272 DWORD SegSs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
273 BYTE[MAXIMUM_SUPPORTED_EXTENSION] ExtendedRegisters;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
274 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
275
189
a4c9de8e39b3 Now compileable with dmd2.053
Abscissa
parents: 79
diff changeset
276 //extern Throwable _d_translate_se_to_d_exception(EXCEPTION_RECORD* exception_record);