GDB (API)
|
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 */