aboutsummaryrefslogtreecommitdiff
path: root/src/processor/stackwalker.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/processor/stackwalker.h')
-rw-r--r--src/processor/stackwalker.h83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/processor/stackwalker.h b/src/processor/stackwalker.h
new file mode 100644
index 00000000..1ae9a85d
--- /dev/null
+++ b/src/processor/stackwalker.h
@@ -0,0 +1,83 @@
+// Copyright (C) 2006 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// stackwalker.cc: Generic stackwalker.
+//
+// The Stackwalker class is an abstract base class providing common generic
+// methods that apply to stacks from all systems. Specific implementations
+// will extend this class by providing GetContextFrame and GetCallerFrame
+// methods to fill in system-specific data in a StackFrame structure.
+// Stackwalker assembles these StackFrame strucutres into a vector of
+// StackFrames.
+//
+// Author: Mark Mentovai
+
+
+#ifndef PROCESSOR_STACKWALKER_H__
+#define PROCESSOR_STACKWALKER_H__
+
+
+#include "google/stack_frame.h"
+#include "processor/memory_region.h"
+
+
+namespace google_airbag {
+
+
+class MinidumpModuleList;
+
+
+class Stackwalker {
+ public:
+ virtual ~Stackwalker() {}
+
+ // Produces a vector of StackFrames by calling GetContextFrame and
+ // GetCallerFrame, and populating the returned frames with module
+ // offset and name information if possible. The caller takes ownership
+ // of the StackFrames object and is responsible for freeing it.
+ StackFrames* Walk();
+
+ protected:
+ // memory identifies a MemoryRegion that provides the stack memory
+ // for the stack to walk. modules, if non-NULL, is a MinidumpModuleList
+ // that is used to look up which code module each stack frame is
+ // associated with.
+ Stackwalker(MemoryRegion* memory, MinidumpModuleList* modules);
+
+ // The stack memory to walk. Subclasses will require this region to
+ // get information from the stack.
+ MemoryRegion* memory_;
+
+ private:
+ // Obtains the context frame, the innermost called procedure in a stack
+ // trace. Returns false on failure.
+ virtual bool GetContextFrame(StackFrame* frame) = 0;
+
+ // Obtains a caller frame. Each call to GetCallerFrame should return the
+ // frame that called the last frame returned by GetContextFrame or
+ // GetCallerFrame. GetCallerFrame should return false on failure or
+ // when there are no more caller frames (when the end of the stack has
+ // been reached).
+ virtual bool GetCallerFrame(StackFrame* frame) = 0;
+
+ // A list of modules, for populating each StackFrame's module information.
+ // This field is optional and may be NULL.
+ MinidumpModuleList* modules_;
+};
+
+
+} // namespace google_airbag
+
+
+#endif // PROCESSOR_STACKWALKER_H__