Use ids for frames.

So that we don't need to send the same frames over and over again.
diff --git a/common/trace_parser.hpp b/common/trace_parser.hpp
index e0f8434..7bf0a7d 100644
--- a/common/trace_parser.hpp
+++ b/common/trace_parser.hpp
@@ -71,23 +71,26 @@
         // Offset in the file of where signature was defined.  It is used when
         // reparsing to determine whether the signature definition is to be
         // expected next or not.
-        File::Offset offset;
+        File::Offset fileOffset;
     };
 
     typedef SigState<FunctionSigFlags> FunctionSigState;
     typedef SigState<StructSig> StructSigState;
     typedef SigState<EnumSig> EnumSigState;
     typedef SigState<BitmaskSig> BitmaskSigState;
+    typedef SigState<StackFrame> StackFrameState;
 
     typedef std::vector<FunctionSigState *> FunctionMap;
     typedef std::vector<StructSigState *> StructMap;
     typedef std::vector<EnumSigState *> EnumMap;
     typedef std::vector<BitmaskSigState *> BitmaskMap;
+    typedef std::vector<StackFrameState *> StackFrameMap;
 
     FunctionMap functions;
     StructMap structs;
     EnumMap enums;
     BitmaskMap bitmasks;
+    StackFrameMap frames;
 
     FunctionSig *glGetErrorSig;
 
@@ -148,7 +151,7 @@
     bool parse_call_details(Call *call, Mode mode);
 
     bool parse_call_backtrace(Call *call, Mode mode);
-    bool parse_backtrace_frame(StackFrame *frame, Mode mode);
+    StackFrame * parse_backtrace_frame(Mode mode);
 
     void adjust_call_flags(Call *call);