What is this thing?

DCTV is a trace analysis tool and viewer.

How do I locally develop?

Get the source code

You're looking at it.

Post-checkout repository initialization

./setup-git-hooks.sh

First build and automatic sanity check

make -j4 check

Clean native code

make clean-native

Building with -O0 and asserts

make clean-native  # Optional
make -j4 dev-debug

Building with -O0 and asserts and GCC

make clean-native  # Optional
make -j4 dev-debug CXX=g++-8

Run random tests

./pytest src/dctv/myfile.py:mytest

Compiling a package with debug symbols

./venv/run pip3 uninstall numpy
./venv/run pip3 install  --no-binary=:all: --no-deps -vvvv --global-option={build_ext,-g} numpy==1.15.4

Submitting

git push origin HEAD:refs/for/master

Print raw DCTV snapshot data

sed -nre 's/^# (\{.*)/\1/p' < dctv.trace  | jq -r '.["snapshots"][0]' > raw_snapshot

As a side effect of the git push, git will print a Gerrit URL that you can use to manage your CL and eventually submit it.

How do I use this thing?

Start up the GUI on a trace file

./dctv gui myfile.trace

SQL REPL

./dctv repl mytrace=myfile.trace

Maintenance tasks

Refresh the bootstrap package list

We use Poetry for most package management, but bootstrap it with pip manually when building a fresh venv. See venv.mk for details. To refresh the checked-in packages, run make -f venv.mk download-bootstrap-packages.

It's okay for the bootstrap packages to be somewhat out of date, since poetry can update these packages the usual way once it initializes itself.

Why zsh for runner scripts?

Zsh is the only thing that provides realpath-like functionality out-of-the-box in a way that's short enough for a one-liner and portable to macOS.

External dependencies

We download external dependencies at venv setup time. We use poetry for Python packages. We handle native dependencies by asking for system packages (e.g., for boost). Where system packages aren't widely available (e.g., Abseil), we have ad-hoc code in native.mk to download specific snapshots of certain projects, with hashes and upstream repository information if native-deps-conf.mk.

Abseil

Strongly prefer standard C++ and Boost to Abseil. We snapshot Abseil. We don‘t “live at head”. We’re interested mostly in the hash tables.