“It is easy to become dependent on debuggers. They allow us to
examine variables and to control flow execution as our applications
run. But what can you do when your application isn’t working and
the debugger can’t help you? Some applications, by nature, make
using a debugger impractical; multithreaded applications fall into
this category. Leroy Xavier, the author of LinuxThreads says,
‘Debuggers are not really effective for subtle concurrency
problems, because they disrupt the program too much.’“Consider a computer telephony application with a separate
thread running for each telephone call. Telephone protocols have
timeout conditions associated with them. When you pick up your
telephone receiver, you get a dial tone and then you start dialing
the number. But, if you fail to dial within a specified timeframe,
the call is made null and void by the protocol, and your dial tone
is history…”