Quantcast
Channel: OCaml - Topics tagged dune
Viewing all articles
Browse latest Browse all 520

Using ocamldebug with dune

$
0
0

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.mluses 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

Read full topic


Viewing all articles
Browse latest Browse all 520

Trending Articles