gdb: Interrupted System Calls

 
 5.5.5 Interrupted System Calls
 ------------------------------
 
 There is an unfortunate side effect when using GDB to debug
 multi-threaded programs.  If one thread stops for a breakpoint, or for
 some other reason, and another thread is blocked in a system call, then
 the system call may return prematurely.  This is a consequence of the
 interaction between multiple threads and the signals that GDB uses to
 implement breakpoints and other events that stop execution.
 
    To handle this problem, your program should check the return value of
 each system call and react appropriately.  This is good programming
 style anyways.
 
    For example, do not write code like this:
 
        sleep (10);
 
    The call to 'sleep' will return early if a different thread stops at
 a breakpoint or for some other reason.
 
    Instead, write this:
 
        int unslept = 10;
        while (unslept > 0)
          unslept = sleep (unslept);
 
    A system call is allowed to return early, so the system is still
 conforming to its specification.  But GDB does cause your multi-threaded
 program to behave differently than it would without GDB.
 
    Also, GDB uses internal breakpoints in the thread library to monitor
 certain events such as thread creation and thread destruction.  When
 such an event happens, a system call in another thread may return
 prematurely, even though your program does not appear to stop.