ocaml/debugger/show_information.ml

122 lines
4.6 KiB
OCaml

(**************************************************************************)
(* *)
(* 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