The ever increasing use of hyper-threading and the availability of inexpensive multiprocessor hardware present tremendous opportunities as well as serious challenges for software developers. In order for software applications to benefit from the continued exponential throughput advances in multicore processors, the applications must be well-written multithreaded software programs. Unfortunately, writing multithreaded software programs that can unleash the full potential of present and future hardware systems remains as challenging today as it was thirty years ago. This research aims to develop practical tools and methodologies that can bring down the complexity of testing/debugging multithreaded programs to a level comparable to that of testing/debugging sequential programs. To this end, existing debugging tools have to be enhanced with powerful reasoning engines that allow them to implicitly analyze all possible thread interleavings under the specified test inputs. During the course of this project a variety of approaches to achieve this objective will be investigated, including some novel ideas that seem particularly promising from a preliminary analysis: (1) efficient symbolic encoding of multithreaded programs, (2) trace-driven abstraction and refinement of their execution, and (3) performance enhancement techniques that allow this approach to scale to realistic program sizes.