Stefan Schuermans commited on 2020-05-22 14:11:56
Showing 12 changed files, with 129 additions and 63 deletions.
| ... | ... |
@@ -5,8 +5,25 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror -fPIC")
|
| 5 | 5 |
|
| 6 | 6 |
enable_testing() |
| 7 | 7 |
|
| 8 |
-add_subdirectory(dump) |
|
| 8 |
+add_custom_command( |
|
| 9 |
+ OUTPUT |
|
| 10 |
+ ${CMAKE_CURRENT_BINARY_DIR}/exports
|
|
| 11 |
+ DEPENDS |
|
| 12 |
+ ${CMAKE_CURRENT_SOURCE_DIR}/exports
|
|
| 13 |
+ COMMAND |
|
| 14 |
+ cp -a ${CMAKE_CURRENT_SOURCE_DIR}/exports ${CMAKE_CURRENT_BINARY_DIR}/exports
|
|
| 15 |
+) |
|
| 16 |
+ |
|
| 17 |
+add_custom_target( |
|
| 18 |
+ copy_exports |
|
| 19 |
+ ALL |
|
| 20 |
+ DEPENDS |
|
| 21 |
+ exports |
|
| 22 |
+) |
|
| 23 |
+ |
|
| 9 | 24 |
add_subdirectory(libuptev) |
| 10 | 25 |
add_subdirectory(libuptpl) |
| 26 |
+add_subdirectory(python3) |
|
| 27 |
+add_subdirectory(upt-dump) |
|
| 11 | 28 |
add_subdirectory(upt-trace) |
| 12 | 29 |
add_subdirectory(tests) |
| ... | ... |
@@ -50,6 +50,12 @@ Run tests: |
| 50 | 50 |
ctest |
| 51 | 51 |
``` |
| 52 | 52 |
|
| 53 |
+Set up for direct usage from build directory (to be done in each shell): |
|
| 54 |
+ |
|
| 55 |
+``` |
|
| 56 |
+source exports |
|
| 57 |
+``` |
|
| 58 |
+ |
|
| 53 | 59 |
## Tracing Applications |
| 54 | 60 |
|
| 55 | 61 |
To trace an application, prefix the command with `upt-trace` and the |
| ... | ... |
@@ -59,12 +65,12 @@ file name for the trace. For example, to trace the command |
| 59 | 65 |
``` |
| 60 | 66 |
run the following command: |
| 61 | 67 |
``` |
| 62 |
-<build dir>/bin/upt-trace mytrace.proto /usr/bin/printf "trace me" |
|
| 68 |
+upt-trace mytrace.proto /usr/bin/printf "trace me" |
|
| 63 | 69 |
``` |
| 64 | 70 |
|
| 65 | 71 |
To show the recorded events, run: |
| 66 | 72 |
``` |
| 67 |
-<build dir>/dump/dump.py mytrace.proto |
|
| 73 |
+upt-dump mytrace.proto |
|
| 68 | 74 |
``` |
| 69 | 75 |
|
| 70 | 76 |
## Example: Trace Build Process |
| ... | ... |
@@ -77,7 +83,7 @@ Change to the build directory. |
| 77 | 83 |
|
| 78 | 84 |
Start a new shell to be traced: |
| 79 | 85 |
``` |
| 80 |
-bin/upt-trace mytrace.proto bash |
|
| 86 |
+upt-trace mytrace.proto bash |
|
| 81 | 87 |
``` |
| 82 | 88 |
|
| 83 | 89 |
Configure another build directory for this tracing example and run the build: |
| ... | ... |
@@ -97,6 +103,6 @@ exit |
| 97 | 103 |
|
| 98 | 104 |
Show traced information: |
| 99 | 105 |
``` |
| 100 |
-dump/dump.py mytrace.proto |
|
| 106 |
+upt-dump mytrace.proto |
|
| 101 | 107 |
``` |
| 102 | 108 |
|
| ... | ... |
@@ -1,27 +0,0 @@ |
| 1 |
-add_custom_command( |
|
| 2 |
- OUTPUT |
|
| 3 |
- ${CMAKE_CURRENT_BINARY_DIR}/uproctrace_pb2.py
|
|
| 4 |
- DEPENDS |
|
| 5 |
- ${CMAKE_SOURCE_DIR}/uproctrace.proto
|
|
| 6 |
- COMMAND |
|
| 7 |
- protoc --proto_path ${CMAKE_SOURCE_DIR}
|
|
| 8 |
- --python_out ${CMAKE_CURRENT_BINARY_DIR}
|
|
| 9 |
- uproctrace.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}/uproctrace_pb2.py
|
|
| 26 |
- ${CMAKE_CURRENT_BINARY_DIR}/dump.py
|
|
| 27 |
-) |
| ... | ... |
@@ -0,0 +1,8 @@ |
| 1 |
+if [[ -z ${BASH_SOURCE[0]:-} ]]
|
|
| 2 |
+then |
|
| 3 |
+ echo "BASH_SOURCE is not net, unsupported shell" >&2 |
|
| 4 |
+ return 2 |
|
| 5 |
+fi |
|
| 6 |
+export UPT_HOME="$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")"
|
|
| 7 |
+export PATH="$UPT_HOME/bin${PATH:+:${PATH}}"
|
|
| 8 |
+export PYTHONPATH="$UPT_HOME/python3${PYTHONPATH:+:${PYTHONPATH}}"
|
| ... | ... |
@@ -0,0 +1 @@ |
| 1 |
+add_subdirectory(uproctrace) |
| ... | ... |
@@ -0,0 +1,35 @@ |
| 1 |
+add_custom_command( |
|
| 2 |
+ OUTPUT |
|
| 3 |
+ ${CMAKE_CURRENT_BINARY_DIR}/uproctrace_pb2.py
|
|
| 4 |
+ DEPENDS |
|
| 5 |
+ ${CMAKE_SOURCE_DIR}/uproctrace.proto
|
|
| 6 |
+ COMMAND |
|
| 7 |
+ protoc --proto_path ${CMAKE_SOURCE_DIR}
|
|
| 8 |
+ --python_out ${CMAKE_CURRENT_BINARY_DIR}
|
|
| 9 |
+ uproctrace.proto |
|
| 10 |
+) |
|
| 11 |
+ |
|
| 12 |
+function(pyfile NAME) |
|
| 13 |
+ add_custom_command( |
|
| 14 |
+ OUTPUT |
|
| 15 |
+ ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.py
|
|
| 16 |
+ DEPENDS |
|
| 17 |
+ ${CMAKE_CURRENT_SOURCE_DIR}/${NAME}.py
|
|
| 18 |
+ COMMAND |
|
| 19 |
+ cp -a ${CMAKE_CURRENT_SOURCE_DIR}/${NAME}.py
|
|
| 20 |
+ ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.py
|
|
| 21 |
+ ) |
|
| 22 |
+ list(APPEND PYFILES ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.py)
|
|
| 23 |
+ set(PYFILES ${PYFILES} PARENT_SCOPE)
|
|
| 24 |
+endfunction(pyfile) |
|
| 25 |
+ |
|
| 26 |
+pyfile(__init__) |
|
| 27 |
+pyfile(dump) |
|
| 28 |
+ |
|
| 29 |
+add_custom_target( |
|
| 30 |
+ python3_uproctrace |
|
| 31 |
+ ALL |
|
| 32 |
+ DEPENDS |
|
| 33 |
+ ${CMAKE_CURRENT_BINARY_DIR}/uproctrace_pb2.py
|
|
| 34 |
+ ${PYFILES}
|
|
| 35 |
+) |
| ... | ... |
@@ -1,18 +1,12 @@ |
| 1 |
-#! /usr/bin/env python3 |
|
| 2 |
- |
|
| 3 |
-import argparse |
|
| 4 |
-import uproctrace_pb2 |
|
| 1 |
+import uproctrace.uproctrace_pb2 as pb2 |
|
| 5 | 2 |
import struct |
| 6 | 3 |
|
| 7 | 4 |
|
| 8 |
-def parse_args(): |
|
| 9 |
- parser = argparse.ArgumentParser(description='dump uproctrace trace') |
|
| 10 |
- parser.add_argument('trace', help='trace file')
|
|
| 11 |
- args = parser.parse_args() |
|
| 12 |
- return args |
|
| 13 |
- |
|
| 14 |
- |
|
| 15 |
-def dump_event(f): |
|
| 5 |
+def dump_event(f, out): |
|
| 6 |
+ """ |
|
| 7 |
+ Read the first event from f and dump it to out. |
|
| 8 |
+ Return True if an event could be found and dumped, False otherwise. |
|
| 9 |
+ """ |
|
| 16 | 10 |
# skip till after magic |
| 17 | 11 |
magic = f.read(4) |
| 18 | 12 |
while magic != b'upt0': |
| ... | ... |
@@ -29,22 +23,11 @@ def dump_event(f): |
| 29 | 23 |
if len(data) < size: |
| 30 | 24 |
return False # EOF |
| 31 | 25 |
# unpack event |
| 32 |
- event = uproctrace_pb2.event.FromString(data) |
|
| 26 |
+ event = pb2.event.FromString(data) |
|
| 33 | 27 |
# dump event |
| 34 |
- print('event {')
|
|
| 28 |
+ print('event {', file=out)
|
|
| 35 | 29 |
for line in repr(event).split('\n'):
|
| 36 | 30 |
if line != '': |
| 37 |
- print(' ' + line)
|
|
| 38 |
- print('}')
|
|
| 31 |
+ print(' ' + line, file=out)
|
|
| 32 |
+ print('}', file=out)
|
|
| 39 | 33 |
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() |
| ... | ... |
@@ -11,12 +11,14 @@ UPT_HOME="$1" |
| 11 | 11 |
|
| 12 | 12 |
SCRIPT_DIR="$(dirname "$0")" |
| 13 | 13 |
|
| 14 |
+source "$UPT_HOME/exports" |
|
| 15 |
+ |
|
| 14 | 16 |
rm -rf out.proto |
| 15 | 17 |
|
| 16 |
-"$UPT_HOME/bin/upt-trace" out.proto "$SCRIPT_DIR/traceme.bash" |
|
| 18 |
+upt-trace out.proto "$SCRIPT_DIR/traceme.bash" |
|
| 17 | 19 |
|
| 18 | 20 |
ls -l out.proto |
| 19 | 21 |
|
| 20 |
-"$UPT_HOME/dump/dump.py" out.proto | tee out.dump |
|
| 22 |
+upt-dump out.proto | tee out.dump |
|
| 21 | 23 |
grep '^ *event *{ *$' out.dump | wc -l | tee out.event_cnt
|
| 22 | 24 |
grep '^6$' out.event_cnt |
| ... | ... |
@@ -12,13 +12,15 @@ UPT_HOME="$(readlink -f "$2")" |
| 12 | 12 |
|
| 13 | 13 |
SCRIPT_DIR="$(dirname "$0")" |
| 14 | 14 |
|
| 15 |
+source "$UPT_HOME/exports" |
|
| 16 |
+ |
|
| 15 | 17 |
rm -rf out.proto build |
| 16 | 18 |
|
| 17 |
-"$UPT_HOME/bin/upt-trace" out.proto "$SCRIPT_DIR/run_build.bash" "$SOURCE_DIR" |
|
| 19 |
+upt-trace out.proto "$SCRIPT_DIR/run_build.bash" "$SOURCE_DIR" |
|
| 18 | 20 |
|
| 19 | 21 |
ls -l out.proto |
| 20 | 22 |
|
| 21 |
-"$UPT_HOME/dump/dump.py" out.proto | tee out.dump |
|
| 23 |
+upt-dump out.proto | tee out.dump |
|
| 22 | 24 |
grep -A 1 '^ *cmdline {$' out.dump | grep '^ *s: "mkdir"$'
|
| 23 | 25 |
grep '^ *s: "proc_begin.c"$' out.dump |
| 24 | 26 |
grep '^ *s: "libuptpl.so"$' out.dump |
| ... | ... |
@@ -0,0 +1,16 @@ |
| 1 |
+add_custom_command( |
|
| 2 |
+ OUTPUT |
|
| 3 |
+ ${CMAKE_BINARY_DIR}/bin/upt-dump
|
|
| 4 |
+ DEPENDS |
|
| 5 |
+ ${CMAKE_CURRENT_SOURCE_DIR}/upt-dump.py
|
|
| 6 |
+ COMMAND |
|
| 7 |
+ cp -a ${CMAKE_CURRENT_SOURCE_DIR}/upt-dump.py
|
|
| 8 |
+ ${CMAKE_BINARY_DIR}/bin/upt-dump
|
|
| 9 |
+) |
|
| 10 |
+ |
|
| 11 |
+add_custom_target( |
|
| 12 |
+ upt-dump |
|
| 13 |
+ ALL |
|
| 14 |
+ DEPENDS |
|
| 15 |
+ ${CMAKE_BINARY_DIR}/bin/upt-dump
|
|
| 16 |
+) |
| ... | ... |
@@ -0,0 +1,23 @@ |
| 1 |
+#! /usr/bin/env python3 |
|
| 2 |
+ |
|
| 3 |
+import argparse |
|
| 4 |
+import sys |
|
| 5 |
+import uproctrace.dump |
|
| 6 |
+ |
|
| 7 |
+ |
|
| 8 |
+def parse_args(): |
|
| 9 |
+ parser = argparse.ArgumentParser(description='dump uproctrace trace') |
|
| 10 |
+ parser.add_argument('trace', help='trace file')
|
|
| 11 |
+ args = parser.parse_args() |
|
| 12 |
+ return args |
|
| 13 |
+ |
|
| 14 |
+ |
|
| 15 |
+def main(): |
|
| 16 |
+ args = parse_args() |
|
| 17 |
+ with open(args.trace, 'rb') as f: |
|
| 18 |
+ while uproctrace.dump.dump_event(f, sys.stdout): |
|
| 19 |
+ pass |
|
| 20 |
+ |
|
| 21 |
+ |
|
| 22 |
+if __name__ == '__main__': |
|
| 23 |
+ main() |
|
| 0 | 24 |