mirror of
https://github.com/NixOS/nix.git
synced 2024-11-26 08:42:30 +00:00
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.
40 lines
1.0 KiB
Python
Executable File
40 lines
1.0 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()
|