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()
|