Debugging distributed systems is a challenging task. The challenge stems from the fact that many errors do not manifest themselves until the systems are deployed to production. Unfortunately, once the systems are deployed, there is no easy way to debug them. In this thesis, I present MaceODB, a tool whose purpose is to assist the programmers in such debugging task. To use MaceODB, the programmers specify properties for their systems. At runtime, MaceODB uses these properties to check the status of the systems that are running, and reports back to the programmers if there were any errors. Using MaceODB, we were able to detect non-trivial bugs in existing systems. This accomplishment is impressive considering the fact that most of these systems have been tested extensively in the past. More importantly, the results from our macro- benchmarks indicate that MaceODB is low in overhead, thus making it possible to be left running on deployed systems with low performance impact