X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Ftrace_writer.cpp;h=46e6392c6d97920215d60db45cc44ea2dd995e25;hb=edea899194c441353943c22577bc22bf0e64d187;hp=be0137619c853cb185abba5d6f84e438c4965e62;hpb=69909e3853c23d0ce062b6c9f232191970da9aee;p=apitrace diff --git a/common/trace_writer.cpp b/common/trace_writer.cpp index be01376..46e6392 100644 --- a/common/trace_writer.cpp +++ b/common/trace_writer.cpp @@ -72,6 +72,7 @@ Writer::open(const char *filename) { structs.clear(); enums.clear(); bitmasks.clear(); + frames.clear(); _writeUInt(TRACE_VERSION); @@ -135,71 +136,41 @@ inline bool lookup(std::vector &map, size_t index) { } } -void Writer::writeBacktrace(std::vector backtrace) { +void Writer::beginBacktrace(unsigned num_frames) { + if (num_frames) { + _writeByte(trace::CALL_BACKTRACE); + _writeUInt(num_frames); + } +} - for (int i = 0; i < backtrace.size(); i++) { - beginStackFrame(); - if (backtrace[i].module != NULL) { - beginStackFrameModule(); - writeString(backtrace[i].module); - endStackFrameModule(); +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 (backtrace[i].function != NULL) { - beginStackFrameFunction(); - writeString(backtrace[i].function); - endStackFrameFunction(); + if (frame->function != NULL) { + _writeByte(trace::BACKTRACE_FUNCTION); + _writeString(frame->function); } - if (backtrace[i].filename != NULL) { - beginStackFrameFilename(); - writeString(backtrace[i].filename); - endStackFrameFilename(); + if (frame->filename != NULL) { + _writeByte(trace::BACKTRACE_FILENAME); + _writeString(frame->filename); } - if (backtrace[i].linenumber != NULL) { - beginStackFrameLinenumber(); - writeString(backtrace[i].linenumber); - endStackFrameLinenumber(); + if (frame->linenumber >= 0) { + _writeByte(trace::BACKTRACE_LINENUMBER); + _writeUInt(frame->linenumber); } - if (backtrace[i].offset != NULL) { - beginStackFrameOffset(); - writeString(backtrace[i].offset); - endStackFrameOffset(); + if (frame->offset >= 0) { + _writeByte(trace::BACKTRACE_OFFSET); + _writeUInt(frame->offset); } - endStackFrame(); + _writeByte(trace::BACKTRACE_END); + frames[frame->id] = true; } } -void Writer::beginBacktrace(void ) { - _writeByte(trace::CALL_BACKTRACE); -} - -void Writer::endBacktrace(void ) { - _writeByte(trace::CALL_BACKTRACE_END); -} - -void Writer::beginStackFrame(void ) { - _writeByte(trace::CALL_BACKTRACE_FRAME); -} - -void Writer::beginStackFrameModule(void ) { - _writeByte(trace::CALL_BACKTRACE_MODULE); -} - -void Writer::beginStackFrameFunction(void ) { - _writeByte(trace::CALL_BACKTRACE_FUNCTION); -} - -void Writer::beginStackFrameFilename(void ) { - _writeByte(trace::CALL_BACKTRACE_FILENAME); -} - -void Writer::beginStackFrameLinenumber(void ) { - _writeByte(trace::CALL_BACKTRACE_LINENUMBER); -} - -void Writer::beginStackFrameOffset(void ) { - _writeByte(trace::CALL_BACKTRACE_OFFSET); -} - unsigned Writer::beginEnter(const FunctionSig *sig, unsigned thread_id) { _writeByte(trace::EVENT_ENTER); _writeUInt(thread_id);