A Quick Guide to Generating Flame Graphs on macOS

Open a terminal and build your application. In this case we will build and profile the Sunder compiler, sunder-compile.

~/sources/sunder$ git rev-parse HEAD
~/sources/sunder$ make bin/sunder-compile CC=clang CFLAGS='$(GNU_REL)' >/dev/null

Open another terminal and clone the FlameGraph sources or navigate to an existing FlameGraph source directory.

~/sources$ git clone https://github.com/brendangregg/FlameGraph.git
Cloning into 'FlameGraph'...
remote: Enumerating objects: 1285, done.
remote: Counting objects: 100% (708/708), done.
remote: Compressing objects: 100% (148/148), done.
remote: Total 1285 (delta 584), reused 574 (delta 560), pack-reused 577
Receiving objects: 100% (1285/1285), 1.92 MiB | 15.00 MiB/s, done.
Resolving deltas: 100% (761/761), done.
~/sources$ cd FlameGraph/

From the FlameGraph sources terminal, run sample <APPLICATION> -wait -f sample.output where <APPLICATION> is the name of your application. The sample program is installed with the Xcode command line tools by running xcode-select --install.

~/sources/FlameGraph$ sample sunder-compile -wait -f sample.output
Waiting for 'sunder-compile' to appear...

Then, in the application terminal, run your application in a scenario you would like to profile.

~/sources/sunder$ ./bin/sunder-compile -o hello examples/hello.sunder

In the FlameGraph terminal you should notice that the sample has been captured.

~/sources/FlameGraph$ sample sunder-compile -wait -f sample.output
Waiting for 'sunder-compile' to appear...  sunder-compile appeared.
Sampling process 42408 for 10 seconds with 1 millisecond of run time between samples
Sampling completed, processing symbols...
Sample analysis of process 42408 written to file sample.output

From the FlameGraph Terminal, run the generated sample.output through the stackcollapse-sample.awk and flamegraph.pl scripts, and redirect the output to a .svg file.

~/sources/FlameGraph$ cat sample.output | ./stackcollapse-sample.awk | ./flamegraph.pl > sample.svg

You should now have a viewable flame graph.

~/sources/FlameGraph$ firefox --new-window "file://$(realpath sample.svg)"