structs.clear();
enums.clear();
bitmasks.clear();
+ frames.clear();
_writeUInt(TRACE_VERSION);
}
}
-void Writer::writeBacktrace(std::vector<RawStackFrame> 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) {