X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Ftrace_writer.cpp;h=46e6392c6d97920215d60db45cc44ea2dd995e25;hb=8b095e5763690867bdc5e8ae204e0712a669b880;hp=f4b82d8f300e0084eb5b6e0943afa49f4be8b2fd;hpb=d559f02eff13e695d0005251dea3e920b20ded65;p=apitrace diff --git a/common/trace_writer.cpp b/common/trace_writer.cpp index f4b82d8..46e6392 100644 --- a/common/trace_writer.cpp +++ b/common/trace_writer.cpp @@ -29,12 +29,13 @@ #include #include #include +#include #include "os.hpp" #include "trace_file.hpp" #include "trace_writer.hpp" #include "trace_format.hpp" - +#include "trace_backtrace.hpp" namespace trace { @@ -71,6 +72,7 @@ Writer::open(const char *filename) { structs.clear(); enums.clear(); bitmasks.clear(); + frames.clear(); _writeUInt(TRACE_VERSION); @@ -134,6 +136,41 @@ inline bool lookup(std::vector &map, size_t index) { } } +void Writer::beginBacktrace(unsigned num_frames) { + if (num_frames) { + _writeByte(trace::CALL_BACKTRACE); + _writeUInt(num_frames); + } +} + +void Writer::writeStackFrame(const RawStackFrame *frame) { + _writeUInt(frame->id); + if (!lookup(frames, frame->id)) { + if (frame->module != NULL) { + _writeByte(trace::BACKTRACE_MODULE); + _writeString(frame->module); + } + if (frame->function != NULL) { + _writeByte(trace::BACKTRACE_FUNCTION); + _writeString(frame->function); + } + if (frame->filename != NULL) { + _writeByte(trace::BACKTRACE_FILENAME); + _writeString(frame->filename); + } + if (frame->linenumber >= 0) { + _writeByte(trace::BACKTRACE_LINENUMBER); + _writeUInt(frame->linenumber); + } + if (frame->offset >= 0) { + _writeByte(trace::BACKTRACE_OFFSET); + _writeUInt(frame->offset); + } + _writeByte(trace::BACKTRACE_END); + frames[frame->id] = true; + } +} + unsigned Writer::beginEnter(const FunctionSig *sig, unsigned thread_id) { _writeByte(trace::EVENT_ENTER); _writeUInt(thread_id); @@ -190,6 +227,10 @@ void Writer::beginStruct(const StructSig *sig) { } } +void Writer::beginRepr(void) { + _writeByte(trace::TYPE_REPR); +} + void Writer::writeBool(bool value) { _writeByte(value ? trace::TYPE_TRUE : trace::TYPE_FALSE); }