Cinquecento is a programming language designed to help programmers examine the state of programs in execution, in particular C programs.
The main features are:
- Target programs are first-class language values. A novel abstraction, called a domain, represents target programs as Cinquecento values.
- C-based syntax and semantics. Operations on domains to examine and modify the state of a target program are specified using C types, expressions, and statements.
- Support for distributed systems. Cinquecento allows any number of domains, each potentially representing a distinct program in a distributed system, to be simultaneously defined.
- Designed for heterogeneous environments. Individual domains are tailored to the architecture, word size, byte order, operating system, and location of the machine on which the target program runs.
- Functional, dynamic language core. Domains and their associated debugging abstractions are embedded in a conventional functional language based on the semantics of Scheme.
- General-purpose analysis of structured binary data. While designed to represent running programs, domains can also provide a C-based typed interface to the contents of binary files, such as core dumps, executables, or program-generated output.
Our Cinquecento implementations are distributed in source-only form, licensed under the GPL.
Documentation
A technical report (pdf) explains the motivation and design of the Cinquecento language. Some details of the language have changed since the report was written (2008).
The L1 implementation is accompanied by a reference manual and a library of Cinquecento code for various debugging applications.
L1 Implementation
The L1 implementation of Cinquecento is written in C for 32-bit and 64-bit x86 OS X and Linux.
- Download a snapshot.
Sctl
A key idea of Cinquecento is to decouple the debugging language from the system-dependent machinery of process control. To debug programs on a particular operating system, you need to interface Cinquecento with the process control mechanism of that system.
Sctl is a remote process control server for Linux. It provides debugging access to processes running on an x86 Linux system via messages exchanged over a TCP connection or Unix socket.
The L1 debug library is a client for sctl. Together, these programs form a language-based debugging system for programs — local or remote, sequential or distributed — running on Linux systems.
- Download a snapshot.
Dwarf2cqct
Cinquecento includes the notion of name space, a language abstraction that catalogs the C types and symbols of a target program. Every target program represented in Cinquecento has an associated name space.
One way to define a name space is the Cinquecento @names form, which allows types and symbols to be specified in a variant of C type and variable declaration syntax.
Dwarf2cqct is a program that converts the DWARF debugging information in a program executable to declarations suitable for direct inclusion in an @names form.
- Download a snapshot.
Dwarf2cqct requires libdwarf.
A set of DWARF Cinquecento library routines included with L1 supersedes dwarf2cqct. But dwarf2cqct is still maintained; in particular, on large executables it (currently) runs noticably faster than the library code.
Replete
Cinquecento works well as an interactive language. Many users reach Cinquecento through Replete, a browser shell designed to complement Cinquecento.
An on-line version of Replete is available here. This demonstration has no active dynamic server-side content and uses Javascript as its interactive language.
Replete is written entirely in Javascript. The demonstration system represents the most recent public snapshot.
Contact
Contact information for the primary Cinquecento developers is listed in the technical report.