#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <vector>
#include "os.hpp"
#include "trace_file.hpp"
#include "trace_writer.hpp"
#include "trace_format.hpp"
-
+#include "trace_backtrace.hpp"
namespace trace {
structs.clear();
enums.clear();
bitmasks.clear();
+ frames.clear();
_writeUInt(TRACE_VERSION);
}
}
+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);
}
}
+void Writer::beginRepr(void) {
+ _writeByte(trace::TYPE_REPR);
+}
+
void Writer::writeBool(bool value) {
_writeByte(value ? trace::TYPE_TRUE : trace::TYPE_FALSE);
}
_writeByte(trace::TYPE_NULL);
}
-void Writer::writeOpaque(const void *addr) {
+void Writer::writePointer(unsigned long long addr) {
if (!addr) {
Writer::writeNull();
return;
}
_writeByte(trace::TYPE_OPAQUE);
- _writeUInt((size_t)addr);
+ _writeUInt(addr);
}