Skip to content

Commit 593f940

Browse files
committed
Dynlink support for ocamldebug
This commit adds dynlink support for ocamldebug. As a side effect, it also: - factorizes the various functions searching for a code fragment into one, called [caml_find_code_fragment]; - removes the [caml_register_code_fragment], which does not seem to be used anywhere, and which clearly should not be used by external code.
1 parent 430c20b commit 593f940

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+791
-413
lines changed

Changes

+7
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ Working version
5252
OCaml callback when called from C.
5353
(Jacques-Henri Jourdan, review by Stephen Dolan and Gabriel Scherer)
5454

55+
### Tools:
56+
57+
* #6792, #8654 ocamldebug now supports program using Dynlink. This
58+
breaks compatibility with emacs modes.
59+
(Whitequark and Jacques-Henri Jourdan, review by Gabriel Scherer
60+
and Xavier Clerc)
61+
5562
### Standard library:
5663

5764
- #8657: Optimization in [Array.make] when initializing with unboxed

boot/ocamlc

3.53 KB
Binary file not shown.

boot/ocamllex

342 Bytes
Binary file not shown.

debugger/.depend

+27-8
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,29 @@ breakpoints.cmo : \
22
symbols.cmi \
33
pos.cmi \
44
parameters.cmi \
5+
../utils/misc.cmi \
56
../bytecomp/instruct.cmi \
67
exec.cmi \
8+
events.cmi \
9+
debugger_config.cmi \
710
debugcom.cmi \
811
checkpoints.cmi \
912
breakpoints.cmi
1013
breakpoints.cmx : \
1114
symbols.cmx \
1215
pos.cmx \
1316
parameters.cmx \
17+
../utils/misc.cmx \
1418
../bytecomp/instruct.cmx \
1519
exec.cmx \
20+
events.cmx \
21+
debugger_config.cmx \
1622
debugcom.cmx \
1723
checkpoints.cmx \
1824
breakpoints.cmi
1925
breakpoints.cmi : \
20-
../bytecomp/instruct.cmi
26+
events.cmi \
27+
debugcom.cmi
2128
checkpoints.cmo : \
2229
primitives.cmi \
2330
int64ops.cmi \
@@ -112,16 +119,19 @@ debugcom.cmo : \
112119
primitives.cmi \
113120
../utils/misc.cmi \
114121
int64ops.cmi \
122+
../bytecomp/instruct.cmi \
115123
input_handling.cmi \
116124
debugcom.cmi
117125
debugcom.cmx : \
118126
primitives.cmx \
119127
../utils/misc.cmx \
120128
int64ops.cmx \
129+
../bytecomp/instruct.cmx \
121130
input_handling.cmx \
122131
debugcom.cmi
123132
debugcom.cmi : \
124-
primitives.cmi
133+
primitives.cmi \
134+
../bytecomp/instruct.cmi
125135
debugger_config.cmo : \
126136
int64ops.cmi \
127137
debugger_config.cmi
@@ -143,6 +153,7 @@ eval.cmo : \
143153
../bytecomp/instruct.cmi \
144154
../typing/ident.cmi \
145155
frames.cmi \
156+
events.cmi \
146157
../typing/env.cmi \
147158
debugcom.cmi \
148159
../typing/ctype.cmi \
@@ -162,6 +173,7 @@ eval.cmx : \
162173
../bytecomp/instruct.cmx \
163174
../typing/ident.cmx \
164175
frames.cmx \
176+
events.cmx \
165177
../typing/env.cmx \
166178
debugcom.cmx \
167179
../typing/ctype.cmx \
@@ -172,8 +184,8 @@ eval.cmi : \
172184
../typing/path.cmi \
173185
parser_aux.cmi \
174186
../parsing/longident.cmi \
175-
../bytecomp/instruct.cmi \
176187
../typing/ident.cmi \
188+
events.cmi \
177189
../typing/env.cmi \
178190
debugcom.cmi
179191
events.cmo : \
@@ -206,7 +218,7 @@ frames.cmx : \
206218
debugcom.cmx \
207219
frames.cmi
208220
frames.cmi : \
209-
../bytecomp/instruct.cmi
221+
events.cmi
210222
history.cmo : \
211223
primitives.cmi \
212224
int64ops.cmi \
@@ -340,18 +352,21 @@ parser.cmo : \
340352
../parsing/longident.cmi \
341353
int64ops.cmi \
342354
input_handling.cmi \
355+
debugcom.cmi \
343356
parser.cmi
344357
parser.cmx : \
345358
parser_aux.cmi \
346359
../parsing/longident.cmx \
347360
int64ops.cmx \
348361
input_handling.cmx \
362+
debugcom.cmx \
349363
parser.cmi
350364
parser.cmi : \
351365
parser_aux.cmi \
352366
../parsing/longident.cmi
353367
parser_aux.cmi : \
354-
../parsing/longident.cmi
368+
../parsing/longident.cmi \
369+
debugcom.cmi
355370
pattern_matching.cmo : \
356371
../typing/typedtree.cmi \
357372
parser_aux.cmi \
@@ -375,13 +390,15 @@ pattern_matching.cmi : \
375390
pos.cmo : \
376391
../parsing/location.cmi \
377392
../bytecomp/instruct.cmi \
393+
events.cmi \
378394
pos.cmi
379395
pos.cmx : \
380396
../parsing/location.cmx \
381397
../bytecomp/instruct.cmx \
398+
events.cmx \
382399
pos.cmi
383400
pos.cmi : \
384-
../bytecomp/instruct.cmi
401+
events.cmi
385402
primitives.cmo : \
386403
$(UNIXDIR)/unix.cmi \
387404
primitives.cmi
@@ -511,7 +528,7 @@ show_information.cmx : \
511528
breakpoints.cmx \
512529
show_information.cmi
513530
show_information.cmi : \
514-
../bytecomp/instruct.cmi
531+
events.cmi
515532
show_source.cmo : \
516533
source.cmi \
517534
primitives.cmi \
@@ -568,7 +585,9 @@ symbols.cmx : \
568585
../bytecomp/bytesections.cmx \
569586
symbols.cmi
570587
symbols.cmi : \
571-
../bytecomp/instruct.cmi
588+
../bytecomp/instruct.cmi \
589+
events.cmi \
590+
debugcom.cmi
572591
time_travel.cmo : \
573592
trap_barrier.cmi \
574593
symbols.cmi \

debugger/breakpoints.ml

+55-73
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
open Checkpoints
2020
open Debugcom
2121
open Instruct
22+
open Events
2223
open Printf
2324

2425
(*** Debugging. ***)
@@ -30,10 +31,11 @@ let debug_breakpoints = ref false
3031
let breakpoint_number = ref 0
3132

3233
(* Breakpoint number -> event. *)
33-
let breakpoints = ref ([] : (int * debug_event) list)
34+
type breakpoint_id = int
35+
let breakpoints = ref ([] : (breakpoint_id * code_event) list)
3436

3537
(* Program counter -> breakpoint count. *)
36-
let positions = ref ([] : (int * int ref) list)
38+
let positions = ref ([] : (pc * int ref) list)
3739

3840
(* Versions of the breakpoint list. *)
3941
let current_version = ref 0
@@ -58,50 +60,46 @@ let breakpoints_count () =
5860

5961
(* List of breakpoints at `pc'. *)
6062
let rec breakpoints_at_pc pc =
61-
begin try
62-
let ev = Symbols.event_at_pc pc in
63-
match ev.ev_repr with
64-
Event_child {contents = pc'} -> breakpoints_at_pc pc'
65-
| _ -> []
66-
with Not_found ->
67-
[]
63+
begin match Symbols.event_at_pc pc with
64+
| {ev_frag = frag; ev_ev = {ev_repr = Event_child {contents = pos}}} ->
65+
breakpoints_at_pc {frag; pos}
66+
| _ -> []
67+
| exception Not_found -> []
6868
end
6969
@
70-
List.map fst (List.filter (function (_, {ev_pos = pos}) -> pos = pc)
71-
!breakpoints)
70+
List.map fst (List.filter
71+
(function (_, {ev_frag = frag; ev_ev = {ev_pos = pos}}) ->
72+
{frag; pos} = pc)
73+
!breakpoints)
7274

7375
(* Is there a breakpoint at `pc' ? *)
7476
let breakpoint_at_pc pc =
7577
breakpoints_at_pc pc <> []
7678

7779
(*** Set and remove breakpoints ***)
7880

81+
let print_pc out {frag;pos} = fprintf out "%d:%d" frag pos
82+
7983
(* Remove all breakpoints. *)
80-
let remove_breakpoints pos =
84+
let remove_breakpoints pcs =
8185
if !debug_breakpoints then
82-
(print_string "Removing breakpoints..."; print_newline ());
86+
printf "Removing breakpoints...\n%!";
8387
List.iter
84-
(function (pos, _) ->
85-
if !debug_breakpoints then begin
86-
print_int pos;
87-
print_newline()
88-
end;
89-
reset_instr pos;
90-
Symbols.set_event_at_pc pos)
91-
pos
88+
(function (pc, _) ->
89+
if !debug_breakpoints then printf "%a\n%!" print_pc pc;
90+
reset_instr pc;
91+
Symbols.set_event_at_pc pc)
92+
pcs
9293

9394
(* Set all breakpoints. *)
94-
let set_breakpoints pos =
95+
let set_breakpoints pcs =
9596
if !debug_breakpoints then
96-
(print_string "Setting breakpoints..."; print_newline ());
97+
printf "Setting breakpoints...\n%!";
9798
List.iter
98-
(function (pos, _) ->
99-
if !debug_breakpoints then begin
100-
print_int pos;
101-
print_newline()
102-
end;
103-
set_breakpoint pos)
104-
pos
99+
(function (pc, _) ->
100+
if !debug_breakpoints then printf "%a\n%!" print_pc pc;
101+
set_breakpoint pc)
102+
pcs
105103

106104
(* Ensure the current version is installed in current checkpoint. *)
107105
let update_breakpoints () =
@@ -119,25 +117,13 @@ let update_breakpoints () =
119117
set_breakpoints !positions;
120118
copy_breakpoints ())
121119

122-
let change_version version pos =
123-
Exec.protect
124-
(function () ->
125-
current_version := version;
126-
positions := pos)
127-
128120
(* Execute given function with no breakpoint in current checkpoint. *)
129121
(* --- `goto' runs faster this way (does not stop on each breakpoint). *)
130122
let execute_without_breakpoints f =
131-
let version = !current_version
132-
and pos = !positions
133-
in
134-
change_version 0 [];
135-
try
136-
f ();
137-
change_version version pos
138-
with
139-
_ ->
140-
change_version version pos
123+
Misc.protect_refs [Misc.R (Debugger_config.break_on_load, false);
124+
Misc.R (current_version, 0);
125+
Misc.R (positions, [])]
126+
f
141127

142128
(* Add a position in the position list. *)
143129
(* Change version if necessary. *)
@@ -160,37 +146,33 @@ let remove_position pos =
160146
end
161147

162148
(* Insert a new breakpoint in lists. *)
163-
let rec new_breakpoint =
164-
function
165-
{ev_repr = Event_child pc} ->
166-
new_breakpoint (Symbols.any_event_at_pc !pc)
167-
| event ->
168-
Exec.protect
169-
(function () ->
170-
incr breakpoint_number;
171-
insert_position event.ev_pos;
172-
breakpoints := (!breakpoint_number, event) :: !breakpoints);
173-
if !Parameters.breakpoint then begin
174-
printf "Breakpoint %d at %d: %s" !breakpoint_number event.ev_pos
175-
(Pos.get_desc event);
176-
print_newline ()
177-
end
149+
let rec new_breakpoint event =
150+
match event with
151+
{ev_frag=frag; ev_ev={ev_repr=Event_child pos}} ->
152+
new_breakpoint (Symbols.any_event_at_pc {frag; pos=(!pos)})
153+
| {ev_frag=frag; ev_ev={ev_pos=pos}} ->
154+
let pc = {frag; pos} in
155+
Exec.protect
156+
(function () ->
157+
incr breakpoint_number;
158+
insert_position pc;
159+
breakpoints := (!breakpoint_number, event) :: !breakpoints);
160+
if !Parameters.breakpoint then
161+
printf "Breakpoint %d at %a: %s\n%!" !breakpoint_number print_pc pc
162+
(Pos.get_desc event)
178163

179164
(* Remove a breakpoint from lists. *)
180165
let remove_breakpoint number =
181166
try
182167
let ev = List.assoc number !breakpoints in
183-
let pos = ev.ev_pos in
184-
Exec.protect
185-
(function () ->
186-
breakpoints := List.remove_assoc number !breakpoints;
187-
remove_position pos;
188-
if !Parameters.breakpoint then begin
189-
printf "Removed breakpoint %d at %d: %s" number ev.ev_pos
190-
(Pos.get_desc ev);
191-
print_newline ()
192-
end
193-
)
168+
let pc = {frag = ev.ev_frag; pos=ev.ev_ev.ev_pos} in
169+
Exec.protect
170+
(function () ->
171+
breakpoints := List.remove_assoc number !breakpoints;
172+
remove_position pc;
173+
if !Parameters.breakpoint then
174+
printf "Removed breakpoint %d at %a: %s\n%!" number print_pc pc
175+
(Pos.get_desc ev))
194176
with
195177
Not_found ->
196178
prerr_endline ("No breakpoint number " ^ (Int.to_string number) ^ ".");
@@ -202,7 +184,7 @@ let remove_all_breakpoints () =
202184
(*** Temporary breakpoints. ***)
203185

204186
(* Temporary breakpoint position. *)
205-
let temporary_breakpoint_position = ref (None : int option)
187+
let temporary_breakpoint_position = ref (None : pc option)
206188

207189
(* Execute `funct' with a breakpoint added at `pc'. *)
208190
(* --- Used by `finish'. *)

0 commit comments

Comments
 (0)