mirror of
https://github.com/wolfpld/tracy.git
synced 2024-11-25 23:44:35 +00:00
check for the presence of the initialization record
This commit is contained in:
parent
d2bdcc2e2c
commit
bafc86326a
@ -1,6 +1,7 @@
|
|||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <exception>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@ -357,6 +358,8 @@ void readLoc(std::string &locFile, uint32_t &locLine,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct TraceNotInitialized : std::exception {};
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (!AttachConsole(ATTACH_PARENT_PROCESS)) {
|
if (!AttachConsole(ATTACH_PARENT_PROCESS)) {
|
||||||
@ -390,6 +393,9 @@ int main(int argc, char **argv) {
|
|||||||
int n_records = 0;
|
int n_records = 0;
|
||||||
std::string name;
|
std::string name;
|
||||||
std::vector<Argument> arguments;
|
std::vector<Argument> arguments;
|
||||||
|
bool initialized = false;
|
||||||
|
|
||||||
|
#define CHECK_INIT() if (!initialized) throw TraceNotInitialized{}
|
||||||
|
|
||||||
while (offset < buf.size()) {
|
while (offset < buf.size()) {
|
||||||
Record r = read_next_record(buf, offset);
|
Record r = read_next_record(buf, offset);
|
||||||
@ -398,11 +404,25 @@ int main(int argc, char **argv) {
|
|||||||
uint8_t ty = r.header & 0xf;
|
uint8_t ty = r.header & 0xf;
|
||||||
|
|
||||||
switch (ty) {
|
switch (ty) {
|
||||||
|
case 0: {
|
||||||
|
// metadata record
|
||||||
|
if (!initialized) {
|
||||||
|
if (r.header == 0x0016547846040010) {
|
||||||
|
// magic string "FxT"
|
||||||
|
// https://fuchsia.dev/fuchsia-src/reference/tracing/trace-format#magic-number-record
|
||||||
|
initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 1: {
|
case 1: {
|
||||||
break; // init record, ignore
|
CHECK_INIT();
|
||||||
|
break; // initialization record
|
||||||
}
|
}
|
||||||
case 2: {
|
case 2: {
|
||||||
// string
|
// string
|
||||||
|
CHECK_INIT();
|
||||||
uint16_t str_ref = (r.header >> 16) & 0xffff;
|
uint16_t str_ref = (r.header >> 16) & 0xffff;
|
||||||
assert((str_ref & 0x8000) == 0);
|
assert((str_ref & 0x8000) == 0);
|
||||||
uint16_t str_len = (r.header >> 32) & 0x7fff;
|
uint16_t str_len = (r.header >> 32) & 0x7fff;
|
||||||
@ -414,6 +434,7 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
case 3: {
|
case 3: {
|
||||||
// thread record
|
// thread record
|
||||||
|
CHECK_INIT();
|
||||||
uint8_t th_ref = (r.header >> 16) & 0xff;
|
uint8_t th_ref = (r.header >> 16) & 0xff;
|
||||||
uint64_t pid = r.p[1];
|
uint64_t pid = r.p[1];
|
||||||
uint64_t tid = r.p[2];
|
uint64_t tid = r.p[2];
|
||||||
@ -423,6 +444,7 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
case 4: {
|
case 4: {
|
||||||
// event
|
// event
|
||||||
|
CHECK_INIT();
|
||||||
uint8_t ev_ty = (r.header >> 16) & 0xf;
|
uint8_t ev_ty = (r.header >> 16) & 0xf;
|
||||||
uint8_t n_args = (r.header >> 20) & 0xf;
|
uint8_t n_args = (r.header >> 20) & 0xf;
|
||||||
|
|
||||||
@ -526,6 +548,7 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
case 7: {
|
case 7: {
|
||||||
// kernel object
|
// kernel object
|
||||||
|
CHECK_INIT();
|
||||||
|
|
||||||
uint8_t ty = (r.header >> 16) & 0xff;
|
uint8_t ty = (r.header >> 16) & 0xff;
|
||||||
uint16_t name_ref = (r.header >> 24) & 0xffff;
|
uint16_t name_ref = (r.header >> 24) & 0xffff;
|
||||||
|
Loading…
Reference in New Issue
Block a user