This project addresses techniques algorithms for design and implementation of a debugging system for parallel programs. The use of flowback analysis provides information on causal relationships between events in a program's execution, without having to re-execute the program for debugging. Flowback analysis directly focuses the programmer on the cause of a problem. Two major issues are addressed: (1) making flowback analysis practical by developing a method that significantly reduces the overhead induced during program execution, and (2) extending the semantics of flowback analysis to parallel programs. Incremental tracing, using semantic analyses of the debugged program, makes the folwback analysis practical with only a small amount of trace generated during execution. Flowback analysis is extended to apply to parallel programs, handling synchronization activities, dependencies between processes, and shared memory access. A method to detect race conditions in the interactions of the co-operating processes is also described. The techniques and algorithms necessary to efficiently debugging both parallel and sequential programs are incorporated in a prototype system built on a commercially available multiprocessor.