diff options
Diffstat (limited to 'src/processor/stackwalker.h')
-rw-r--r-- | src/processor/stackwalker.h | 83 |
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__ |