X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Ftrace_writer.cpp;h=46e6392c6d97920215d60db45cc44ea2dd995e25;hb=52398312caaba3e1bc0613016d5bf3507d1e242a;hp=2dc7a00ea8c7502de88304abdbbed2239f425001;hpb=aa1b2136cc72893e519ff73c47e2ecd29cafe1da;p=apitrace diff --git a/common/trace_writer.cpp b/common/trace_writer.cpp index 2dc7a00..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,77 +136,46 @@ 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(FunctionSig *sig, unsigned thread_id) { +unsigned Writer::beginEnter(const FunctionSig *sig, unsigned thread_id) { _writeByte(trace::EVENT_ENTER); _writeUInt(thread_id); _writeUInt(sig->id); if (!lookup(functions, sig->id)) { - sig->backtrace = backtrace_is_needed(sig->name); _writeString(sig->name); _writeUInt(sig->num_args); for (unsigned i = 0; i < sig->num_args; ++i) {