This paper describes a source level debugger (CBUG) for concurrent programs written in C. Although C does not directly support concurrent processes, it is traditionally augmented by the standard UNIX system calls (fork, etc.). The basic object to CBUG is a process. Support exists for monitoring, tracing, and single stepping at message and synchronization granularity. A multiwindow user environment supports windows for processes, I/O (pipes, files, etc.), and menus. The paper is oriented towards C and UNIX experts, although the references are extensive.
CBUG uses hooks in the C source, compiling a modified version with the debugger. A concurrent program is monitored by a supervisory routine that starts each process, waits for it to finish, and cleans up after it. Processes are invoked with embedded copies of CBUG which communicate with one another to support interactive breaks, deadlock recovery, single stepping, and redirection of output to the windows.
The paper includes a nice discussion of how program behavior is altered when timing delays are introduced. (Probe Effect) CBUG is actually powerful enough to determine how much overhead can be tolerated without introducing the probe effect. In another example, CBUG demonstrates exactly how correct answers can be obtained from incorrectly synchronized processes.