OLD | NEW |
| (Empty) |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef CHROME_FRAME_CRASH_REPORTING_VECTORED_HANDLER_H_ | |
6 #define CHROME_FRAME_CRASH_REPORTING_VECTORED_HANDLER_H_ | |
7 | |
8 | |
9 #if !defined(_M_IX86) | |
10 #error only x86 is supported for now. | |
11 #endif | |
12 | |
13 // Create dump policy: | |
14 // 1. Scan SEH chain, if there is a handler/filter that belongs to our | |
15 // module - assume we expect this one and hence do nothing here. | |
16 // 2. If the address of the exception is in our module - create dump. | |
17 // 3. If our module is in somewhere in callstack - create dump. | |
18 // The E class is supposed to provide external/API functions. Using template | |
19 // make testability easier. It shall confirm the following concept/archetype: | |
20 //struct E { | |
21 // void WriteDump(EXCEPTION_POINTERS* p) { | |
22 // } | |
23 // | |
24 // // Used mainly to ignore exceptions from IsBadRead/Write/Ptr. | |
25 // bool ShouldIgnoreException(const EXCEPTION_POINTERS* exptr) { | |
26 // return 0; | |
27 // } | |
28 // | |
29 // // Retrieve the SEH list head. | |
30 // EXCEPTION_REGISTRATION_RECORD* RtlpGetExceptionList() { | |
31 // return NULL; | |
32 // } | |
33 // | |
34 // // Get the stack trace as correctly as possible. | |
35 // WORD RtlCaptureStackBackTrace(DWORD FramesToSkip, DWORD FramesToCapture, | |
36 // void** BackTrace, DWORD* BackTraceHash) { | |
37 // return 0; | |
38 // } | |
39 // | |
40 // // Check whether the stack guard page is in place. | |
41 // bool CheckForStackOverflow(EXCEPTION_POINTERS* p) { | |
42 // return 0; | |
43 // } | |
44 // | |
45 // bool IsOurModule(const void* address) { | |
46 // return 0; | |
47 // } | |
48 //}; | |
49 // The methods shall be placed in .text$veh_m | |
50 template <typename E> | |
51 class VectoredHandlerT { | |
52 public: | |
53 VectoredHandlerT(E* api); | |
54 ~VectoredHandlerT(); | |
55 | |
56 // TODO(stoyan): Come with better way to skip initial stack frames. | |
57 FORCEINLINE LONG Handler(EXCEPTION_POINTERS* exceptionInfo); | |
58 long get_exceptions_seen() const { | |
59 return exceptions_seen_; | |
60 } | |
61 | |
62 private: | |
63 bool ModuleHasInstalledSEHFilter(); | |
64 E* api_; | |
65 long exceptions_seen_; | |
66 }; | |
67 | |
68 // Maintains start and end address of a single module of interest. If we want | |
69 // do check for multiple modules, this class has to be extended to support a | |
70 // list of modules (DLLs). | |
71 struct ModuleOfInterest { | |
72 // The callback from VectoredHandlerT::Handler(). | |
73 inline bool IsOurModule(const void* address) { | |
74 return (start_ <= address && address < end_); | |
75 } | |
76 | |
77 // Helpers. | |
78 inline void SetModule(const void* module_start, const void* module_end) { | |
79 start_ = module_start; | |
80 end_ = module_end; | |
81 } | |
82 | |
83 inline void SetCurrentModule() { | |
84 // Find current module boundaries. | |
85 const void* start = &__ImageBase; | |
86 const char* s = reinterpret_cast<const char*>(start); | |
87 const IMAGE_NT_HEADERS32* nt = reinterpret_cast<const IMAGE_NT_HEADERS32*> | |
88 (s + __ImageBase.e_lfanew); | |
89 const void* end = s + nt->OptionalHeader.SizeOfImage; | |
90 SetModule(start, end); | |
91 } | |
92 | |
93 const void* start_; | |
94 const void* end_; | |
95 }; | |
96 | |
97 struct ModuleOfInterestWithExcludedRegion : public ModuleOfInterest { | |
98 inline bool IsOurModule(const void* address) { | |
99 return (start_ <= address && address < end_) && | |
100 (address < special_region_start_ || special_region_end_ <= address); | |
101 } | |
102 | |
103 inline void SetExcludedRegion(const void* start, const void* end) { | |
104 special_region_start_ = start; | |
105 special_region_end_ = end; | |
106 } | |
107 | |
108 const void* special_region_start_; | |
109 const void* special_region_end_; | |
110 }; | |
111 | |
112 | |
113 #endif // CHROME_FRAME_CRASH_REPORTING_VECTORED_HANDLER_H_ | |
OLD | NEW |