1. A method comprising: halting, with a debug engine, a first thread of a plurality of threads of a program in response to the first thread encountering a breakpoint; determining, with the debug engine, a first subset of the plurality of threads that are waiting for a first mutex that is locked by the first thread while the first thread is halted, wherein the first mutex is locked by the first thread sending a mutex lock request to a mutex system that enforces mutual exclusion, and storing, with the debug engine, thread data received from the mutex system indicating the first mutex is locked by the first thread; executing, with the debug engine, a second subset of the plurality of threads that are not waiting for the first mutex; determining, with the debug engine, identifiers of the first subset of the plurality of threads; responsive to the halting, presenting upon a user interface the identifiers of the first subset of the plurality of threads and an identifier of the first thread, wherein presenting the first subset of the plurality of threads further comprises displaying a breakpoint address field that identifies the breakpoint and displaying a thread identifier field that identifies the first subset of the plurality of threads, and; receiving, with the mutex system, a mutex unlock request to unlock the first mutex from the first thread, the mutex unlock request comprising an identifier of the first thread and an identifier of the first mutex locked by the first thread; determining, with the mutex system, by querying a mutex data record that indicates whether the first thread owns the first mutex, and; responsive to the determining that the first thread owns the first mutex, updating the mutex data record, with the mutex system, to indicate a second waiting thread now owns the first mutex and storing, with the debug engine, thread data received from the mutex system indicating the first mutex is owned by the second thread.