forked from ocaml-flambda/flambda-backend
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathshow_information.ml
121 lines (116 loc) · 4.57 KB
/
show_information.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
(**************************************************************************)
(* *)
(* OCaml *)
(* *)
(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *)
(* OCaml port by John Malecki and Xavier Leroy *)
(* *)
(* Copyright 1996 Institut National de Recherche en Informatique et *)
(* en Automatique. *)
(* *)
(* All rights reserved. This file is distributed under the terms of *)
(* the GNU Lesser General Public License version 2.1, with the *)
(* special exception on linking described in the file LICENSE. *)
(* *)
(**************************************************************************)
open Instruct
open Format
open Debugcom
open Checkpoints
open Events
open Symbols
open Frames
open Source
open Show_source
open Breakpoints
open Parameters
(* Display information about the current event. *)
let show_current_event ppf =
if !Parameters.time then begin
fprintf ppf "Time: %Li" (current_time ());
(match current_pc () with
| Some pc ->
fprintf ppf " - pc: %i:%i" pc.frag pc.pos
| _ -> ());
end;
update_current_event ();
reset_frame ();
match current_report () with
| None ->
if !Parameters.time then fprintf ppf "@.";
fprintf ppf "Beginning of program.@.";
show_no_point ()
| Some {rep_type = (Event | Breakpoint); rep_program_pointer = pc} ->
let ev = (get_current_event ()).ev_ev in
if !Parameters.time then fprintf ppf " - module %s@." ev.ev_module;
(match breakpoints_at_pc pc with
| [] ->
()
| [breakpoint] ->
fprintf ppf "Breakpoint: %i@." breakpoint
| breakpoints ->
fprintf ppf "Breakpoints: %a@."
(fun ppf l ->
List.iter
(function x -> fprintf ppf "%i " x) l)
(List.sort compare breakpoints));
show_point ev true
| Some {rep_type = Exited} ->
if !Parameters.time then fprintf ppf "@.";
fprintf ppf "Program exit.@.";
show_no_point ()
| Some {rep_type = Uncaught_exc} ->
if !Parameters.time then fprintf ppf "@.";
fprintf ppf
"Program end.@.\
@[Uncaught exception:@ %a@]@."
Printval.print_exception (Debugcom.Remote_value.accu ());
show_no_point ()
| Some {rep_type = Code_loaded frag} ->
let mds = String.concat ", " (Symbols.modules_in_code_fragment frag) in
fprintf ppf "@.Module(s) %s loaded.@." mds;
show_no_point ()
| Some {rep_type = Trap_barrier}
| Some {rep_type = Debug_info _}
| Some {rep_type = Code_unloaded _} ->
(* Not visible outside *)
(* of module `time_travel'. *)
if !Parameters.time then fprintf ppf "@.";
Misc.fatal_error "Show_information.show_current_event"
(* Display short information about one frame. *)
let show_one_frame framenum ppf ev =
let pos = Events.get_pos ev.ev_ev in
let cnum =
try
let buffer = get_buffer pos ev.ev_ev.ev_module in
snd (start_and_cnum buffer pos)
with _ -> pos.Lexing.pos_cnum in
if !machine_readable then
fprintf ppf "#%i Pc: %i:%i %s char %i@."
framenum ev.ev_frag ev.ev_ev.ev_pos ev.ev_ev.ev_module
cnum
else
fprintf ppf "#%i %s %s:%i:%i@."
framenum ev.ev_ev.ev_module
pos.Lexing.pos_fname pos.Lexing.pos_lnum
(pos.Lexing.pos_cnum - pos.Lexing.pos_bol + 1)
(* Display information about the current frame. *)
(* --- `select frame' must have succeeded before calling this function. *)
let show_current_frame ppf selected =
match !selected_event with
| None ->
fprintf ppf "@.No frame selected.@."
| Some sel_ev ->
show_one_frame !current_frame ppf sel_ev;
begin match breakpoints_at_pc
{frag=sel_ev.ev_frag; pos = sel_ev.ev_ev.ev_pos} with
| [] -> ()
| [breakpoint] ->
fprintf ppf "Breakpoint: %i@." breakpoint
| breakpoints ->
fprintf ppf "Breakpoints: %a@."
(fun ppf l ->
List.iter (function x -> fprintf ppf "%i " x) l)
(List.sort compare breakpoints);
end;
show_point sel_ev.ev_ev selected