GDB (API)
/home/stan/gdb/src/gdb/tracepoint.h
Go to the documentation of this file.
00001 /* Data structures associated with tracepoints in GDB.
00002    Copyright (C) 1997-2013 Free Software Foundation, Inc.
00003 
00004    This file is part of GDB.
00005 
00006    This program is free software; you can redistribute it and/or modify
00007    it under the terms of the GNU General Public License as published by
00008    the Free Software Foundation; either version 3 of the License, or
00009    (at your option) any later version.
00010 
00011    This program is distributed in the hope that it will be useful,
00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014    GNU General Public License for more details.
00015 
00016    You should have received a copy of the GNU General Public License
00017    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
00018 
00019 #if !defined (TRACEPOINT_H)
00020 #define TRACEPOINT_H 1
00021 
00022 #include "breakpoint.h"
00023 #include "target.h"
00024 #include "memrange.h"
00025 #include "gdb_vecs.h"
00026 
00027 /* An object describing the contents of a traceframe.  */
00028 
00029 struct traceframe_info
00030 {
00031   /* Collected memory.  */
00032   VEC(mem_range_s) *memory;
00033 
00034   /* Collected trace state variables.  */
00035   VEC(int) *tvars;
00036 };
00037 
00038 /* A trace state variable is a value managed by a target being
00039    traced.  A trace state variable (or tsv for short) can be accessed
00040    and assigned to by tracepoint actions and conditionals, but is not
00041    part of the program being traced, and it doesn't have to be
00042    collected.  Effectively the variables are scratch space for
00043    tracepoints.  */
00044 
00045 struct trace_state_variable
00046   {
00047     /* The variable's name.  The user has to prefix with a dollar sign,
00048        but we don't store that internally.  */
00049     const char *name;
00050 
00051     /* An id number assigned by GDB, and transmitted to targets.  */
00052     int number;
00053 
00054     /* The initial value of a variable is a 64-bit signed integer.  */
00055     LONGEST initial_value;
00056 
00057     /* 1 if the value is known, else 0.  The value is known during a
00058        trace run, or in tfind mode if the variable was collected into
00059        the current trace frame.  */
00060     int value_known;
00061 
00062     /* The value of a variable is a 64-bit signed integer.  */
00063     LONGEST value;
00064 
00065     /* This is true for variables that are predefined and built into
00066        the target.  */
00067     int builtin;
00068    };
00069 
00070 /* The trace status encompasses various info about the general state
00071    of the tracing run.  */
00072 
00073 enum trace_stop_reason
00074   {
00075     trace_stop_reason_unknown,
00076     trace_never_run,
00077     tstop_command,
00078     trace_buffer_full,
00079     trace_disconnected,
00080     tracepoint_passcount,
00081     tracepoint_error
00082   };
00083 
00084 struct trace_status
00085 {
00086   /* If the status is coming from a file rather than a live target,
00087      this points at the file's filename.  Otherwise, this is NULL.  */
00088   const char *filename;
00089 
00090   /* This is true if the value of the running field is known.  */
00091   int running_known;
00092 
00093   /* This is true when the trace experiment is actually running.  */
00094   int running;
00095 
00096   enum trace_stop_reason stop_reason;
00097 
00098   /* If stop_reason is tracepoint_passcount or tracepoint_error, this
00099      is the (on-target) number of the tracepoint which caused the
00100      stop.  */
00101   int stopping_tracepoint;
00102 
00103   /* If stop_reason is tstop_command or tracepoint_error, this is an
00104      arbitrary string that may describe the reason for the stop in
00105      more detail.  */
00106 
00107   char *stop_desc;
00108 
00109   /* Number of traceframes currently in the buffer.  */
00110 
00111   int traceframe_count;
00112 
00113   /* Number of traceframes created since start of run.  */
00114 
00115   int traceframes_created;
00116 
00117   /* Total size of the target's trace buffer.  */
00118 
00119   int buffer_size;
00120 
00121   /* Unused bytes left in the target's trace buffer.  */
00122 
00123   int buffer_free;
00124 
00125   /* 1 if the target will continue tracing after disconnection, else
00126      0.  If the target does not report a value, assume 0.  */
00127 
00128   int disconnected_tracing;
00129 
00130   /* 1 if the target is using a circular trace buffer, else 0.  If the
00131      target does not report a value, assume 0.  */
00132 
00133   int circular_buffer;
00134 
00135   /* The "name" of the person running the trace.  This is an
00136      arbitrary string.  */
00137 
00138   char *user_name;
00139 
00140   /* "Notes" about the trace.  This is an arbitrary string not
00141      interpreted by GDBserver in any special way.  */
00142 
00143   char *notes;
00144 
00145   /* The calendar times at which the trace run started and stopped,
00146      both expressed in microseconds of Unix time.  */
00147 
00148   LONGEST start_time;
00149   LONGEST stop_time;
00150 };
00151 
00152 struct trace_status *current_trace_status (void);
00153 
00154 extern char *default_collect;
00155 
00156 extern int trace_regblock_size;
00157 
00158 /* Struct to collect random info about tracepoints on the target.  */
00159 
00160 struct uploaded_tp
00161 {
00162   int number;
00163   enum bptype type;
00164   ULONGEST addr;
00165   int enabled;
00166   int step;
00167   int pass;
00168   int orig_size;
00169 
00170   /* String that is the encoded form of the tracepoint's condition.  */
00171   char *cond;
00172 
00173   /* Vectors of strings that are the encoded forms of a tracepoint's
00174      actions.  */
00175   VEC(char_ptr) *actions;
00176   VEC(char_ptr) *step_actions;
00177 
00178   /* The original string defining the location of the tracepoint.  */
00179   char *at_string;
00180 
00181   /* The original string defining the tracepoint's condition.  */
00182   char *cond_string;
00183 
00184   /* List of original strings defining the tracepoint's actions.  */
00185   VEC(char_ptr) *cmd_strings;
00186 
00187   /* The tracepoint's current hit count.  */
00188   int hit_count;
00189 
00190   /* The tracepoint's current traceframe usage.  */
00191   ULONGEST traceframe_usage;
00192 
00193   struct uploaded_tp *next;
00194 };
00195 
00196 /* Struct recording info about trace state variables on the target.  */
00197 
00198 struct uploaded_tsv
00199 {
00200   const char *name;
00201   int number;
00202   LONGEST initial_value;
00203   int builtin;
00204   struct uploaded_tsv *next;
00205 };
00206 
00207 /* Struct recording info about a target static tracepoint marker.  */
00208 
00209 struct static_tracepoint_marker
00210 {
00211   struct gdbarch *gdbarch;
00212   CORE_ADDR address;
00213 
00214   /* The string ID of the marker.  */
00215   char *str_id;
00216 
00217   /* Extra target reported info associated with the marker.  */
00218   char *extra;
00219 };
00220 
00221 struct trace_file_writer;
00222 
00223 /* Operations to write trace frames to a specific trace format.  */
00224 
00225 struct trace_frame_write_ops
00226 {
00227   /* Write a new trace frame.  The tracepoint number of this trace
00228      frame is TPNUM.  */
00229   void (*start) (struct trace_file_writer *self, uint16_t tpnum);
00230 
00231   /* Write an 'R' block.  Buffer BUF contains its contents and SIZE is
00232      its size.  */
00233   void (*write_r_block) (struct trace_file_writer *self,
00234                          gdb_byte *buf, int32_t size);
00235 
00236   /* Write an 'M' block, the header and memory contents respectively.
00237      The header of 'M' block is composed of the start address and the
00238      length of memory collection, and the memory contents contain
00239      the collected memory contents in tracing.
00240      For extremely large M block, GDB is unable to get its contents
00241      and write them into trace file in one go, due to the limitation
00242      of the remote target or the size of internal buffer, we split
00243      the operation to 'M' block to two operations.  */
00244   /* Write the head of 'M' block.  ADDR is the start address of
00245      collected memory and LENGTH is the length of memory contents.  */
00246   void (*write_m_block_header) (struct trace_file_writer *self,
00247                                 uint64_t addr, uint16_t length);
00248   /* Write the memory contents of 'M' block.  Buffer BUF contains
00249      its contents and LENGTH is its length.  This method can be called
00250      multiple times to write large memory contents of a single 'M'
00251      block.  */
00252   void (*write_m_block_memory) (struct trace_file_writer *self,
00253                                 gdb_byte *buf, uint16_t length);
00254 
00255   /* Write a 'V' block.  NUM is the trace variable number and VAL is
00256      the value of the trace variable.  */
00257   void (*write_v_block) (struct trace_file_writer *self, int32_t num,
00258                          uint64_t val);
00259 
00260   /* The end of the trace frame.  */
00261   void (*end) (struct trace_file_writer *self);
00262 };
00263 
00264 /* Operations to write trace buffers to a specific trace format.  */
00265 
00266 struct trace_file_write_ops
00267 {
00268   /* Destructor.  Releases everything from SELF (but not SELF
00269      itself).  */
00270   void (*dtor) (struct trace_file_writer *self);
00271 
00272   /*  Save the data to file or directory NAME of desired format in
00273       target side.  Return true for success, otherwise return
00274       false.  */
00275   int (*target_save) (struct trace_file_writer *self,
00276                       const char *name);
00277 
00278   /* Write the trace buffers to file or directory NAME.  */
00279   void (*start) (struct trace_file_writer *self,
00280                  const char *name);
00281 
00282   /* Write the trace header.  */
00283   void (*write_header) (struct trace_file_writer *self);
00284 
00285   /* Write the type of block about registers.  SIZE is the size of
00286      all registers on the target.  */
00287   void (*write_regblock_type) (struct trace_file_writer *self,
00288                                int size);
00289 
00290   /* Write trace status TS.  */
00291   void (*write_status) (struct trace_file_writer *self,
00292                         struct trace_status *ts);
00293 
00294   /* Write the uploaded TSV.  */
00295   void (*write_uploaded_tsv) (struct trace_file_writer *self,
00296                               struct uploaded_tsv *tsv);
00297 
00298   /* Write the uploaded tracepoint TP.  */
00299   void (*write_uploaded_tp) (struct trace_file_writer *self,
00300                              struct uploaded_tp *tp);
00301 
00302   /* Write to mark the end of the definition part.  */
00303   void (*write_definition_end) (struct trace_file_writer *self);
00304 
00305   /* Write the data of trace buffer without parsing.  The content is
00306      in BUF and length is LEN.  */
00307   void (*write_trace_buffer) (struct trace_file_writer *self,
00308                               gdb_byte *buf, LONGEST len);
00309 
00310   /* Operations to write trace frames.  The user of this field is
00311      responsible to parse the data of trace buffer.  Either field
00312      'write_trace_buffer' or field ' frame_ops' is NULL.  */
00313   const struct trace_frame_write_ops *frame_ops;
00314 
00315   /* The end of writing trace buffers.  */
00316   void (*end) (struct trace_file_writer *self);
00317 };
00318 
00319 /* Trace file writer for a given format.  */
00320 
00321 struct trace_file_writer
00322 {
00323   const struct trace_file_write_ops *ops;
00324 };
00325 
00326 struct memrange
00327 {
00328   /* memrange_absolute for absolute memory range, else basereg
00329      number.  */
00330   int type;
00331   bfd_signed_vma start;
00332   bfd_signed_vma end;
00333 };
00334 
00335 struct collection_list
00336 {
00337   /* room for up to 256 regs */
00338   unsigned char regs_mask[32];
00339   long listsize;
00340   long next_memrange;
00341   struct memrange *list;
00342 
00343   /* size of array pointed to by expr_list elt.  */
00344   long aexpr_listsize;
00345   long next_aexpr_elt;
00346   struct agent_expr **aexpr_list;
00347 
00348   /* True is the user requested a collection of "$_sdata", "static
00349      tracepoint data".  */
00350   int strace_data;
00351 
00352   /* A set of names of wholly collected objects.  */
00353   VEC(char_ptr) *wholly_collected;
00354   /* A set of computed expressions.  */
00355   VEC(char_ptr) *computed;
00356 };
00357 
00358 extern void parse_static_tracepoint_marker_definition
00359   (char *line, char **pp,
00360    struct static_tracepoint_marker *marker);
00361 extern void release_static_tracepoint_marker (struct static_tracepoint_marker *);
00362 extern void free_current_marker (void *arg);
00363 
00364 /* A hook used to notify the UI of tracepoint operations.  */
00365 
00366 extern void (*deprecated_trace_find_hook) (char *arg, int from_tty);
00367 extern void (*deprecated_trace_start_stop_hook) (int start, int from_tty);
00368 
00369 /* Returns the current traceframe number.  */
00370 extern int get_traceframe_number (void);
00371 
00372 /* Returns the tracepoint number for current traceframe.  */
00373 extern int get_tracepoint_number (void);
00374 
00375 /* Make the traceframe NUM be the current GDB trace frame number, and
00376    do nothing more.  In particular, this does not flush the
00377    register/frame caches or notify the target about the trace frame
00378    change, so that is can be used when we need to momentarily access
00379    live memory.  Targets lazily switch their current traceframe to
00380    match GDB's traceframe number, at the appropriate times.  */
00381 extern void set_traceframe_number (int);
00382 
00383 /* Make the traceframe NUM be the current trace frame, all the way to
00384    the target, and flushes all global state (register/frame caches,
00385    etc.).  */
00386 extern void set_current_traceframe (int num);
00387 
00388 struct cleanup *make_cleanup_restore_current_traceframe (void);
00389 struct cleanup *make_cleanup_restore_traceframe_number (void);
00390 
00391 void free_actions (struct breakpoint *);
00392 
00393 extern const char *decode_agent_options (const char *exp, int *trace_string);
00394 
00395 extern struct cleanup *
00396   encode_actions_and_make_cleanup (struct bp_location *tloc,
00397                                    struct collection_list *tracepoint_list,
00398                                    struct collection_list *stepping_list);
00399 
00400 extern void encode_actions_rsp (struct bp_location *tloc,
00401                                 char ***tdp_actions, char ***stepping_actions);
00402 
00403 extern void validate_actionline (const char *, struct breakpoint *);
00404 extern void validate_trace_state_variable_name (const char *name);
00405 
00406 extern struct trace_state_variable *find_trace_state_variable (const char *name);
00407 extern struct trace_state_variable *
00408   find_trace_state_variable_by_number (int number);
00409 
00410 extern struct trace_state_variable *create_trace_state_variable (const char *name);
00411 
00412 extern int encode_source_string (int num, ULONGEST addr,
00413                                  char *srctype, char *src,
00414                                  char *buf, int buf_size);
00415 
00416 extern void parse_trace_status (char *line, struct trace_status *ts);
00417 
00418 extern void parse_tracepoint_status (char *p, struct breakpoint *tp,
00419                                      struct uploaded_tp *utp);
00420 
00421 extern void parse_tracepoint_definition (char *line,
00422                                          struct uploaded_tp **utpp);
00423 extern void parse_tsv_definition (char *line, struct uploaded_tsv **utsvp);
00424 
00425 extern struct uploaded_tp *get_uploaded_tp (int num, ULONGEST addr,
00426                                             struct uploaded_tp **utpp);
00427 extern struct uploaded_tsv *get_uploaded_tsv (int num,
00428                                               struct uploaded_tsv **utsvp);
00429 extern struct tracepoint *create_tracepoint_from_upload (struct uploaded_tp *utp);
00430 extern void merge_uploaded_tracepoints (struct uploaded_tp **utpp);
00431 extern void merge_uploaded_trace_state_variables (struct uploaded_tsv **utsvp);
00432 
00433 extern void query_if_trace_running (int from_tty);
00434 extern void disconnect_tracing (void);
00435 extern void trace_reset_local_state (void);
00436 
00437 extern void start_tracing (char *notes);
00438 extern void stop_tracing (char *notes);
00439 
00440 extern void trace_status_mi (int on_stop);
00441 
00442 extern void tvariables_info_1 (void);
00443 extern void save_trace_state_variables (struct ui_file *fp);
00444 
00445 extern void tfind_1 (enum trace_find_type type, int num,
00446                      CORE_ADDR addr1, CORE_ADDR addr2,
00447                      int from_tty);
00448 
00449 extern void trace_save_tfile (const char *filename,
00450                               int target_does_save);
00451 extern void trace_save_ctf (const char *dirname,
00452                             int target_does_save);
00453 
00454 extern struct traceframe_info *parse_traceframe_info (const char *tframe_info);
00455 
00456 extern int traceframe_available_memory (VEC(mem_range_s) **result,
00457                                         CORE_ADDR memaddr, ULONGEST len);
00458 
00459 extern struct traceframe_info *get_traceframe_info (void);
00460 
00461 extern struct bp_location *get_traceframe_location (int *stepping_frame_p);
00462 
00463 #endif  /* TRACEPOINT_H */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines