Skip to content
Snippets Groups Projects
  1. Sep 18, 2019
  2. Aug 14, 2019
    • Graham Christensen's avatar
      Track function start and ends for flame graphs · ee9c988a
      Graham Christensen authored
      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.
      Unverified
      ee9c988a
Loading