DDMon proof-of-concept monitoring tool for distributed black-box .deadlock
detection in Erlang and Elixir systems based on generic servers (gen_server).
We developed the tool as a drop-in replacement for generic servers with minimal
user intervention required. DDMon is the implementation and companion artifact
of our work accepted at OOPSLA 2025: "Correct Black-Box Monitors for Distributed
Deadlock Detection: Formalisation and Implementation"
This document contains prerequisites and instructions for building DDMon.
NOTE: To evaluate the OOPSLA'25 artifact, you can use a Docker-based setup for DDMon. In this case, you can simply follow the instructions in OVERVIEW.md and skip the rest of this file.
NOTE: The following build instructions are tested on GNU/Linux (Ubuntu 24.04 and 25.04, and Fedora 42) and macOS.
- Erlang/OTP, version
26or higher - Elixir, version
1.14or higher - Mix
- Python 3 with numpy (at least 2.2), pandas (at least 2.2) and matplotlib (at least 3.10) --- for plotting benchmark results
If you do not have Erlang or Elixir installed, we provide a script that automatically downloads and installs the correct versions. Make sure you have the following build dependencies installed on your system:
autoconfmakelibssl-devopensslncurseswxWidgets
To automatically obtain the right versions of Erlang and Elixir, source (not
run!) the provided script in bash:
source install-otp.shThis will use asdf version manager to install
Erlang and Elixir. If you do not have asdf on your system, it shall be
installed in the currently visited directory. You may need to run this script in
every shell session in order to set up PATH correctly.
To create a local build of DDMon, run:
makeIf you do not have make, you can run the following instead:
mix deps.get
mix escript.buildAfter building DDMon, you can follow the instructions referenced from OVERVIEW.md --- except that, to use your local build of DDMon, you should remove the Docker-related part of each command. For example, if the instructions ask you to run:
docker run --rm -v "$(pwd)/output:/app/output" ddmon ./bench.sh smallthen you should run instead:
./bench.sh small