読者です 読者をやめる 読者になる 読者になる

Debug the Haxe Compiler with OCamlDebug

1. Apply the following patch to the Makefile:

diff --git a/Makefile b/Makefile
index e912e15..1f6c71f 100644
--- a/Makefile
+++ b/Makefile
@@ -80,7 +80,7 @@ libs:
        make -C libs/objsize OCAMLOPT=$(OCAMLOPT) OCAMLC=$(OCAMLC) $(TARGET_FLAG)
 
 haxe: $(MODULES:=.$(MODULE_EXT))
-       $(COMPILER) -o $(OUTPUT) $(NATIVE_LIBS) $(NATIVE_LIB_FLAG) $(LFLAGS) $(LIBS:=.$(LIB_EXT)) $(MODULES:=.$(MODULE_EXT))
+       $(COMPILER) -g -o $(OUTPUT) $(NATIVE_LIBS) $(NATIVE_LIB_FLAG) $(LFLAGS) $(LIBS:=.$(LIB_EXT)) $(MODULES:=.$(MODULE_EXT))
 
 haxelib:
        (cd $(CURDIR)/extra/haxelib_src && $(CURDIR)/$(OUTPUT) haxelib.hxml && nekotools boot bin/haxelib.n)

2. Build the compiler with the following command:

make BYTECODE=1

3. Execute ocamldebug:

ocamldebug ./haxe [arguments]
% ocamldebug ./haxe
	OCaml Debugger version 4.02.1

(ocd) break @ Main 979
Loading program... done.
Breakpoint 1 at 3223236: file main.ml, line 980, characters 2-29726
(ocd) run
Time: 69442 - pc: 3223236 - module Main
Breakpoint: 1
980 	<|b|>let usage = Printf.sprintf
(ocd) n 20
Time: 69757 - pc: 3223608 - module Main
1000 	Common.define_value com Define.HaxeVer (float_repres (float_of_int version /. 1000.))<|a|>;
(ocd) p version
version: int = 3300
(ocd) rev
Time: 69442 - pc: 3223236 - module Main
Breakpoint: 1
980 	<|b|>let usage = Printf.sprintf
(ocd) prev
Time: 69441 - pc: 3198700 - module Main
637 			<|b|>init ctx;
(ocd)

You can even trace back to the past!

Check the debugger commands at The debugger (ocamldebug).

Happy hacking!