aboutsummaryrefslogtreecommitdiff
path: root/src/google
diff options
context:
space:
mode:
Diffstat (limited to 'src/google')
-rw-r--r--src/google/call_stack.h73
-rw-r--r--src/google/minidump_processor.h8
-rw-r--r--src/google/stack_frame.h47
-rw-r--r--src/google/stack_frame_cpu.h103
4 files changed, 200 insertions, 31 deletions
diff --git a/src/google/call_stack.h b/src/google/call_stack.h
new file mode 100644
index 00000000..6e8f5f13
--- /dev/null
+++ b/src/google/call_stack.h
@@ -0,0 +1,73 @@
+// Copyright (c) 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// call_stack.h: A call stack comprised of stack frames.
+//
+// This class manages a vector of stack frames. It is used instead of
+// exposing the vector directly to allow the CallStack to own StackFrame
+// pointers without having to publicly export the linked_ptr class. A
+// CallStack must be composed of pointers instead of objects to allow for
+// CPU-specific StackFrame subclasses.
+//
+// By convention, the stack frame at index 0 is the innermost callee frame,
+// and the frame at the highest index in a call stack is the outermost
+// caller. CallStack only allows stacks to be built by pushing frames,
+// beginning with the innermost callee frame.
+//
+// Author: Mark Mentovai
+
+#ifndef GOOGLE_CALL_STACK_H__
+#define GOOGLE_CALL_STACK_H__
+
+#include <vector>
+
+namespace google_airbag {
+
+using std::vector;
+
+struct StackFrame;
+template<typename T> class linked_ptr;
+
+class CallStack {
+ public:
+ ~CallStack();
+
+ const vector<StackFrame*>* frames() const { return &frames_; }
+
+ private:
+ // Stackwalker is responsible for building the frames_ vector.
+ friend class Stackwalker;
+
+ // Storage for pushed frames.
+ vector<StackFrame*> frames_;
+};
+
+} // namespace google_airbag
+
+#endif // GOOGLE_CALL_STACK_H__
diff --git a/src/google/minidump_processor.h b/src/google/minidump_processor.h
index d5470b70..925ea90a 100644
--- a/src/google/minidump_processor.h
+++ b/src/google/minidump_processor.h
@@ -31,12 +31,12 @@
#define GOOGLE_MINIDUMP_PROCESSOR_H__
#include <string>
-#include "google/stack_frame.h"
namespace google_airbag {
using std::string;
+class CallStack;
class SymbolSupplier;
class MinidumpProcessor {
@@ -46,9 +46,9 @@ class MinidumpProcessor {
MinidumpProcessor(SymbolSupplier *supplier);
~MinidumpProcessor();
- // Fills in the given StackFrames vector by processing the minidump file.
- // Returns true on success.
- bool Process(const string &minidump_file, StackFrames *stack_frames);
+ // Fills in the given CallStack by processing the minidump file. Returns
+ // true on success.
+ bool Process(const string &minidump_file, CallStack *stack);
private:
SymbolSupplier *supplier_;
diff --git a/src/google/stack_frame.h b/src/google/stack_frame.h
index 110dfc63..43b52dd0 100644
--- a/src/google/stack_frame.h
+++ b/src/google/stack_frame.h
@@ -31,58 +31,51 @@
#define GOOGLE_STACK_FRAME_H__
#include <string>
-#include <vector>
#include "google/airbag_types.h"
namespace google_airbag {
using std::string;
-using std::vector;
struct StackFrame {
- // Initialize sensible defaults, or this will be instantiated with
- // primitive members in an undetermined state.
StackFrame()
- : instruction()
- , frame_pointer()
- , module_base()
- , module_name()
- , function_base()
- , function_name()
- , source_file_name()
- , source_line() {}
-
- // The program counter location relative to the module base
+ : instruction(),
+ module_base(),
+ module_name(),
+ function_base(),
+ function_name(),
+ source_file_name(),
+ source_line() {}
+ virtual ~StackFrame() {}
+
+ // The program counter location as an absolute virtual address. For the
+ // innermost called frame in a stack, this will be an exact program counter
+ // or instruction pointer value. For all other frames, this will be within
+ // the instruction that caused execution to branch to a called function,
+ // but may not necessarily point to the exact beginning of that instruction.
u_int64_t instruction;
- // The frame pointer to this stack frame
- u_int64_t frame_pointer;
-
- // The base address of the module
+ // The base address of the module.
u_int64_t module_base;
- // The module in which the pc resides
+ // The module in which the instruction resides.
string module_name;
// The start address of the function, may be omitted if debug symbols
// are not available.
u_int64_t function_base;
- // The function name, may be omitted if debug symbols are not available
+ // The function name, may be omitted if debug symbols are not available.
string function_name;
- // The source file name, may be omitted if debug symbols are not available
+ // The source file name, may be omitted if debug symbols are not available.
string source_file_name;
- // The (1-based) source line number,
- // may be omitted if debug symbols are not available
+ // The (1-based) source line number, may be omitted if debug symbols are
+ // not available.
int source_line;
-
- // TODO(bryner): saved registers
};
-typedef vector<StackFrame> StackFrames;
-
} // namespace google_airbag
#endif // GOOGLE_STACK_FRAME_H__
diff --git a/src/google/stack_frame_cpu.h b/src/google/stack_frame_cpu.h
new file mode 100644
index 00000000..46539418
--- /dev/null
+++ b/src/google/stack_frame_cpu.h
@@ -0,0 +1,103 @@
+// Copyright (c) 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// stack_frame_cpu.h: CPU-specific StackFrame extensions.
+//
+// These types extend the StackFrame structure to carry CPU-specific register
+// state. They are defined in this header instead of stack_frame.h to
+// avoid the need to include minidump_format.h when only the generic
+// StackFrame type is needed.
+//
+// Author: Mark Mentovai
+
+#ifndef GOOGLE_STACK_FRAME_CPU_H__
+#define GOOGLE_STACK_FRAME_CPU_H__
+
+#include "google/stack_frame.h"
+#include "processor/minidump_format.h"
+
+namespace google_airbag {
+
+struct StackFrameX86 : public StackFrame {
+ // ContextValidity has one entry for each relevant hardware pointer register
+ // (%eip and %esp) and one entry for each nonvolatile (callee-save) register.
+ enum ContextValidity {
+ CONTEXT_VALID_NONE = 0,
+ CONTEXT_VALID_EIP = 1 << 0,
+ CONTEXT_VALID_ESP = 1 << 1,
+ CONTEXT_VALID_EBP = 1 << 2,
+ CONTEXT_VALID_EBX = 1 << 3,
+ CONTEXT_VALID_ESI = 1 << 4,
+ CONTEXT_VALID_EDI = 1 << 5,
+ CONTEXT_VALID_ALL = -1
+ };
+
+ StackFrameX86() : context(), context_validity(CONTEXT_VALID_NONE) {}
+
+ // Register state. This is only fully valid for the topmost frame in a
+ // stack. In other frames, the values of nonvolatile registers may be
+ // present, given sufficient debugging information. Refer to
+ // context_validity.
+ MDRawContextX86 context;
+
+ // context_validity is actually ContextValidity, but int is used because
+ // the OR operator doesn't work well with enumerated types. This indicates
+ // which fields in context are valid.
+ int context_validity;
+};
+
+struct StackFramePPC : public StackFrame {
+ // ContextValidity should eventually contain entries for the validity of
+ // other nonvolatile (callee-save) registers as in
+ // StackFrameX86::ContextValidity, but the ppc stackwalker doesn't currently
+ // locate registers other than the ones listed here.
+ enum ContextValidity {
+ CONTEXT_VALID_NONE = 0,
+ CONTEXT_VALID_SRR0 = 1 << 0,
+ CONTEXT_VALID_GPR1 = 1 << 1,
+ CONTEXT_VALID_ALL = -1
+ };
+
+ StackFramePPC() : context(), context_validity(CONTEXT_VALID_NONE) {}
+
+ // Register state. This is only fully valid for the topmost frame in a
+ // stack. In other frames, the values of nonvolatile registers may be
+ // present, given sufficient debugging information. Refer to
+ // context_validity.
+ MDRawContextPPC context;
+
+ // context_validity is actually ContextValidity, but int is used because
+ // the OR operator doesn't work well with enumerated types. This indicates
+ // which fields in context are valid.
+ int context_validity;
+};
+
+} // namespace google_airbag
+
+#endif // GOOGLE_STACK_FRAME_CPU_H__