Here's a simpler test case: -module(bloop2). -compile(export_all). start() -> gen_server:start(?MODULE, , ). init() -> exit(self(), burlap). The cause seems to be that proc_lib:sync_wait/2 expects to receive an EXIT message if Pid exits, but proc_lib:start* is often called from contexts where the trap_exit flag is unset (e.g., gen_server).