I have a problem trying to use ocamldebug
on programs compiled with dune
.
Suppose I have the following dune
project:
<root>/src/lib/foo.ml
/dune
<root>/example/main.ml
/dune
where foo.ml
defines a library and main.ml
uses it. For ex (silly example)
(* foo.ml *)
let bar x =
let y = x*2 in
y+1
(* main.ml *)
let _ =
let r1 = Foo.bar 1 in
let r2 = Foo.bar 2 in
print_int (r1+r2)
These files are, classicaly, compiled with the following dune
stanzas, resp.:
(library
(name foo)
(modules foo ))
and
(executable
(name main)
(modes byte)
(modules main)
(libraries foo))
To use ocamldebug
the resulting program (main.bc
), i cd
to the corresponding _build
subdir:
cd _build/default/example
and run ocamldebug
(either from the CL or Emacs) passing main.bc
as the program name and no argument (IIUC dune
uses the -g
ocamlc
argument for bytecode pgms).
I would have imagined that setting a breakpoint, say at line 2 of foo.ml
would not work because the current directory (_build/default/example
) does not contain the corresponding source file. Surprizingly enough, it does:
(ocd) break @ Foo 2
Loading program... done.
Breakpoint 1 at 0:10492: file src/lib/foo.ml, line 2, characters 3-25
It seems that dune
has, somehow “under the hood” adjusted the directory
variable of ocamldebug
. This is confimed by inspecting this variable:
(ocd) directory
Reinitialize directory list ? (y or n) n
Directories: . /Users/jserot/.opam/4.10.0/lib/ocaml
/Users/jserot/.opam/4.10.0/.opam-switch/build/ocaml-base-compiler.4.10.0/stdlib
/Users/jserot/.opam/4.10.0/lib/ocaml
/Users/jserot/Dev/ml/dune-debug/_build/default
/Users/jserot/Dev/ml/dune-debug/_build/default/example
/Users/jserot/Dev/ml/dune-debug/_build/default/example/.main.eobjs/byte
/Users/jserot/Dev/ml/dune-debug/_build/default/src/lib
/Users/jserot/Dev/ml/dune-debug/_build/default/src/lib/.foo.objs/byte
So far so good.
The problem is that setting a breakpoint in main.ml
does not work:
(ocd) list "main.ml"
1 let _ =
2 let r1 = Foo.bar 1 in
3 let r2 = Foo.bar 2 in
4 print_int (r1+r2)
Position out of range.
(ocd) break @ Main 2
Can't find any event there.
What’s going on here ? The corresponding source file
- is in directory listed in the
ocamldebug
directory
variable - has been compiled with
-g
Am i missing sth ?
8 posts - 3 participants