forked from lix-project/lix
ee9c988a1b
With this patch, and this file I called `log.py`: #!/usr/bin/env nix-shell #!nix-shell -i python3 -p python3 --pure import sys from pprint import pprint stack = [] timestack = [] for line in open(sys.argv[1]): components = line.strip().split(" ", 2) if components[0] != "function-trace": continue direction = components[1] components = components[2].rsplit(" ", 2) loc = components[0] _at = components[1] time = int(components[2]) if direction == "entered": stack.append(loc) timestack.append(time) elif direction == "exited": dur = time - timestack.pop() vst = ";".join(stack) print(f"{vst} {dur}") stack.pop() and: nix-instantiate --trace-function-calls -vvvv ../nixpkgs/pkgs/top-level/release.nix -A unstable > log.matthewbauer 2>&1 ./log.py ./log.matthewbauer > log.matthewbauer.folded flamegraph.pl --title matthewbauer-post-pr log.matthewbauer.folded > log.matthewbauer.folded.svg I can make flame graphs like: http://gsc.io/log.matthewbauer.folded.svg --- Includes test cases around function call failures and tryEval. Uses RAII so the finish is always called at the end of the function.
39 lines
1 KiB
Python
Executable file
39 lines
1 KiB
Python
Executable file
#!/usr/bin/env nix-shell
|
|
#!nix-shell -i python3 -p python3 --pure
|
|
|
|
# To be used with `--trace-function-calls` and `-vvvv` and
|
|
# `flamegraph.pl`.
|
|
#
|
|
# For example:
|
|
#
|
|
# nix-instantiate --trace-function-calls -vvvv '<nixpkgs>' -A hello 2> nix-function-calls.trace
|
|
# ./contrib/stack-collapse.py nix-function-calls.trace > nix-function-calls.folded
|
|
# nix-shell -p flamegraph --run "flamegraph.pl nix-function-calls.folded > nix-function-calls.svg"
|
|
|
|
import sys
|
|
from pprint import pprint
|
|
import fileinput
|
|
|
|
stack = []
|
|
timestack = []
|
|
|
|
for line in fileinput.input():
|
|
components = line.strip().split(" ", 2)
|
|
if components[0] != "function-trace":
|
|
continue
|
|
|
|
direction = components[1]
|
|
components = components[2].rsplit(" ", 2)
|
|
|
|
loc = components[0]
|
|
_at = components[1]
|
|
time = int(components[2])
|
|
|
|
if direction == "entered":
|
|
stack.append(loc)
|
|
timestack.append(time)
|
|
elif direction == "exited":
|
|
dur = time - timestack.pop()
|
|
vst = ";".join(stack)
|
|
print(f"{vst} {dur}")
|
|
stack.pop()
|