This appears to be happening because ocamldebug is receiving unexpected
data from ocamlrun, presumably because the forked ocamlrun processes are
competing with one another to send data along the same connection to
ocamldebug.

Occasionally, though, ocamldebug doesn't crash, but continues to report
data from both parent and child ocamlrun processes. Issuing further step
commands to ocamldebug causes the forked processes to repond in a round-
robin style. Presumably this is because the forked ocamlrun processes
are still competing with one another to read data from the same shared
connection to ocamlbug, and are picking up commands alternately, one
after the other.

The current behaviour is making it difficult for us to debug programs
that launch other processes using the traditional "fork-exec" sequence,
since debugged programs have a very good chance of crashing immediately
after they call Unix.fork().

I'm wondering, is it possible to make ocamlrun aware of Unix.fork(),
so that a child ocamlrun process doesn't attempt to communicate with
ocamldebug through the same socket as its parent process?

I've been playing around with ocamldebug support for fork a bit, and I'll attach a patch shortly. It works by closing the connection to one of the processes, and it includes a gdb-like option to pick whether to follow the parent or child process. One small wart is that I've added a stub implementation of the debugging functions to the native code runtime; another option would be to build two versions of the unix library.

The patch was made against 3.11.1, but applies to the trunk version too.