First, note that ocamldebug only works with the bytecode backend.
So remember to include the following line in your dune file
(modes byte)
as in the other post you linked to. Then pass the name of the bytecode executable to ocamldebug, e.g., ocamldebug _build/default/merge_sort_mutable.bc.
As for breakpoints, dune renames the main module under the hood to avoid name clashes. This can be controlled with the option wrapped_executables in dune-project.
You may therefore have to set a breakpoint on the renamed module with:
break @Dune__exe__Main 21
Notice the Dune__exe__ prefix with double, not single underscores.
I haven’t checked how your usage of the same name merge_sort_mutable for both a public executable and a library plays together with the above renaming. For a start, I would probably play it safe myself and use, e.g., (public_name main) until I got it working…