Stefan Schuermans commited on 2020-05-17 18:41:55
Showing 4 changed files, with 79 additions and 0 deletions.
... | ... |
@@ -0,0 +1,27 @@ |
1 |
+add_custom_command( |
|
2 |
+ OUTPUT |
|
3 |
+ ${CMAKE_CURRENT_BINARY_DIR}/lwproctrace_pb2.py |
|
4 |
+ DEPENDS |
|
5 |
+ ${CMAKE_SOURCE_DIR}/lwproctrace.proto |
|
6 |
+ COMMAND |
|
7 |
+ protoc --proto_path ${CMAKE_SOURCE_DIR} |
|
8 |
+ --python_out ${CMAKE_CURRENT_BINARY_DIR} |
|
9 |
+ lwproctrace.proto |
|
10 |
+) |
|
11 |
+ |
|
12 |
+add_custom_command( |
|
13 |
+ OUTPUT |
|
14 |
+ ${CMAKE_CURRENT_BINARY_DIR}/dump.py |
|
15 |
+ DEPENDS |
|
16 |
+ ${CMAKE_CURRENT_SOURCE_DIR}/dump.py |
|
17 |
+ COMMAND |
|
18 |
+ cp -a ${CMAKE_CURRENT_SOURCE_DIR}/dump.py ${CMAKE_CURRENT_BINARY_DIR}/dump.py |
|
19 |
+) |
|
20 |
+ |
|
21 |
+add_custom_target( |
|
22 |
+ dump |
|
23 |
+ ALL |
|
24 |
+ DEPENDS |
|
25 |
+ ${CMAKE_CURRENT_BINARY_DIR}/lwproctrace_pb2.py |
|
26 |
+ ${CMAKE_CURRENT_BINARY_DIR}/dump.py |
|
27 |
+) |
... | ... |
@@ -0,0 +1,50 @@ |
1 |
+#! /usr/bin/env python3 |
|
2 |
+ |
|
3 |
+import argparse |
|
4 |
+import lwproctrace_pb2 |
|
5 |
+import struct |
|
6 |
+ |
|
7 |
+ |
|
8 |
+def parse_args(): |
|
9 |
+ parser = argparse.ArgumentParser(description='dump lwproctrace trace') |
|
10 |
+ parser.add_argument('trace', help='trace file') |
|
11 |
+ args = parser.parse_args() |
|
12 |
+ return args |
|
13 |
+ |
|
14 |
+ |
|
15 |
+def dump_event(f): |
|
16 |
+ # skip till after magic |
|
17 |
+ magic = f.read(4) |
|
18 |
+ while magic != b'lwpt': |
|
19 |
+ if len(magic) < 4: |
|
20 |
+ return False # EOF |
|
21 |
+ magic = magic[1:] + f.read(1) # search for magic byte for byte |
|
22 |
+ # read size of next event (32 bit network byte order) |
|
23 |
+ size = f.read(4) |
|
24 |
+ if len(size) < 4: |
|
25 |
+ return False # EOF |
|
26 |
+ size = struct.unpack('!L', size)[0] |
|
27 |
+ # read event data |
|
28 |
+ data = f.read(size) |
|
29 |
+ if len(data) < size: |
|
30 |
+ return False # EOF |
|
31 |
+ # unpack event |
|
32 |
+ event = lwproctrace_pb2.event.FromString(data) |
|
33 |
+ # dump event |
|
34 |
+ print('event {') |
|
35 |
+ for line in repr(event).split('\n'): |
|
36 |
+ if line != '': |
|
37 |
+ print(' ' + line) |
|
38 |
+ print('}') |
|
39 |
+ return True |
|
40 |
+ |
|
41 |
+ |
|
42 |
+def main(): |
|
43 |
+ args = parse_args() |
|
44 |
+ with open(args.trace, 'rb') as f: |
|
45 |
+ while dump_event(f): |
|
46 |
+ pass |
|
47 |
+ |
|
48 |
+ |
|
49 |
+if __name__ == '__main__': |
|
50 |
+ main() |