]> git.cworth.org Git - apitrace/blobdiff - common/trace_writer_model.cpp
Backtrace via call detail
[apitrace] / common / trace_writer_model.cpp
index 2e858a233971e3434410b8daba6fb5601c66e3a9..cdf9783b4ba1655e0e02ecfacab062a65386a3e5 100644 (file)
@@ -107,8 +107,49 @@ public:
         writer.endRepr();
     }
 
+    void visit(StackFrame* frame) {
+        writer.beginStackFrame();
+        if (frame->module != NULL) {
+            writer.beginStackFrameModule();
+            _visit(frame->module);
+            writer.endStackFrameModule();
+        }
+        if (frame->function != NULL) {
+            writer.beginStackFrameFunction();
+            _visit(frame->function);
+            writer.endStackFrameFunction();
+        }
+        if (frame->filename != NULL) {
+            writer.beginStackFrameFilename();
+            _visit(frame->filename);
+            writer.endStackFrameFilename();
+        }
+        if (frame->linenumber != NULL) {
+            writer.beginStackFrameLinenumber();
+            _visit(frame->linenumber);
+            writer.endStackFrameLinenumber();
+        }
+        if (frame->offset != NULL) {
+            writer.beginStackFrameOffset();
+            _visit(frame->offset);
+            writer.endStackFrameOffset();
+        }
+        writer.endStackFrame();
+    }
+
+    void visit(Backtrace * backtrace) {
+        writer.beginBacktrace();
+        for (int i =0; i < backtrace->frames.size(); i++) {
+            visit(backtrace->frames[i]);
+        }
+        writer.endBacktrace();
+    }
+
     void visit(Call *call) {
         unsigned call_no = writer.beginEnter(call->sig, call->thread_id);
+        if (call->backtrace != NULL) {
+            visit(call->backtrace);
+        }
         for (unsigned i = 0; i < call->args.size(); ++i) {
             if (call->args[i].value) {
                 writer.beginArg(i);