25#include "gdbsupport/byte-vector.h"
27#include "gdbsupport/buildargv.h"
31#define TRACE_WRITE_R_BLOCK(writer, buf, size) \
32 writer->ops->frame_ops->write_r_block ((writer), (buf), (size))
33#define TRACE_WRITE_M_BLOCK_HEADER(writer, addr, size) \
34 writer->ops->frame_ops->write_m_block_header ((writer), (addr), \
36#define TRACE_WRITE_M_BLOCK_MEMORY(writer, buf, size) \
37 writer->ops->frame_ops->write_m_block_memory ((writer), (buf), \
39#define TRACE_WRITE_V_BLOCK(writer, num, val) \
40 writer->ops->frame_ops->write_v_block ((writer), (num), (val))
55typedef std::unique_ptr<trace_file_writer, trace_file_writer_deleter>
72#define MAX_TRACE_UPLOAD 2000
81 error (_(
"Target failed to save trace data to '%s'."),
92 writer->
ops->
start (writer, filename);
119 for (utsv = uploaded_tsvs; utsv; utsv = utsv->
next)
126 for (utp = uploaded_tps; utp; utp = utp->
next)
129 for (utp = uploaded_tps; utp; utp = utp->
next)
153 error (_(
"Failure to get requested trace buffer data"));
201 error (_(
"Failure to get requested trace buffer data"));
215 error (_(
"Failure to get requested trace"
231 error (_(
"Failure to get requested trace"
241 mlen = (
unsigned short)
251 for (j = 0; j < mlen; )
253 unsigned int read_length;
258 read_length = mlen - j;
264 error (_(
"Failure to get requested"
265 " trace buffer data"));
272 gotten += read_length;
286 error (_(
"Failure to get requested"
287 " trace buffer data"));
300 error (_(
"Unknown block type '%c' (0x%x) in"
316 writer->
ops->
end (writer);
322 int target_does_save = 0;
324 char *filename = NULL;
325 int generate_ctf = 0;
330 gdb_argv built_argv (args);
331 argv = built_argv.get ();
333 for (; *argv; ++argv)
335 if (strcmp (*argv,
"-r") == 0)
336 target_does_save = 1;
337 else if (strcmp (*argv,
"-ctf") == 0)
339 else if (**argv ==
'-')
340 error (_(
"unknown option `%s'"), *argv);
354 gdb_printf (_(
"Trace data saved to %s '%s'.\n"),
355 generate_ctf ?
"directory" :
"file", filename);
364 trace_save (filename, writer.get (), target_does_save);
373 trace_save (dirname, writer.get (), target_does_save);
399 warning (_(
"Tracepoint %d has multiple "
400 "locations, cannot infer $pc"),
407 warning (_(
"Tracepoint %d does while-stepping, "
480Save the trace data to a file.\n\
481Use the '-ctf' option to save the data to CTF format.\n\
482Use the '-r' option to direct the target to save directly to the file,\n\
483using its own filesystem."));
struct gdbarch * target_gdbarch(void)
struct tracepoint * get_tracepoint(int num)
void raw_supply(int regnum, const void *buf) override
bool has_registers() override
bool has_stack() override
bool has_all_memory() override
bool has_memory() override
int get_trace_status(trace_status *ts) override
bool thread_alive(ptid_t ptid) override
void error_no_arg(const char *why)
struct cmd_list_element * add_com(const char *name, enum command_class theclass, cmd_simple_func_ftype *fun, const char *doc)
static LONGEST extract_signed_integer(gdb::array_view< const gdb_byte > buf, enum bfd_endian byte_order)
static ULONGEST extract_unsigned_integer(gdb::array_view< const gdb_byte > buf, enum bfd_endian byte_order)
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
int gdbarch_num_regs(struct gdbarch *gdbarch)
void gdbarch_guess_tracepoint_registers(struct gdbarch *gdbarch, struct regcache *regcache, CORE_ADDR addr)
bool has_locations() const
bp_location & first_loc()
bool has_multiple_locations() const
void(* start)(struct trace_file_writer *self, const char *name)
void(* write_header)(struct trace_file_writer *self)
void(* write_definition_end)(struct trace_file_writer *self)
void(* write_uploaded_tsv)(struct trace_file_writer *self, struct uploaded_tsv *tsv)
void(* dtor)(struct trace_file_writer *self)
void(* end)(struct trace_file_writer *self)
void(* write_regblock_type)(struct trace_file_writer *self, int size)
void(* write_trace_buffer)(struct trace_file_writer *self, gdb_byte *buf, LONGEST len)
void(* write_uploaded_tp)(struct trace_file_writer *self, struct uploaded_tp *tp)
int(* target_save)(struct trace_file_writer *self, const char *name)
const struct trace_frame_write_ops * frame_ops
void(* write_tdesc)(struct trace_file_writer *self)
void(* write_status)(struct trace_file_writer *self, struct trace_status *ts)
void operator()(struct trace_file_writer *writer)
const struct trace_file_write_ops * ops
void(* end)(struct trace_file_writer *self)
void(* start)(struct trace_file_writer *self, uint16_t tpnum)
struct uploaded_tp * next
struct uploaded_tsv * next
LONGEST target_get_raw_trace_data(gdb_byte *buf, ULONGEST offset, LONGEST len)
int target_upload_trace_state_variables(uploaded_tsv **utsvp)
int target_upload_tracepoints(uploaded_tp **utpp)
int target_get_trace_status(trace_status *ts)
void target_get_tracepoint_status(tracepoint *tp, uploaded_tp *utp)
struct trace_file_writer * ctf_trace_file_writer_new(void)
struct trace_file_writer * tfile_trace_file_writer_new(void)
void _initialize_tracefile()
void tracefile_fetch_registers(struct regcache *regcache, int regno)
#define TRACE_WRITE_M_BLOCK_MEMORY(writer, buf, size)
#define TRACE_WRITE_M_BLOCK_HEADER(writer, addr, size)
std::unique_ptr< trace_file_writer, trace_file_writer_deleter > trace_file_writer_up
static void tsave_command(const char *args, int from_tty)
static void trace_save(const char *filename, struct trace_file_writer *writer, int target_does_save)
#define TRACE_WRITE_V_BLOCK(writer, num, val)
#define TRACE_WRITE_R_BLOCK(writer, buf, size)
void trace_save_tfile(const char *filename, int target_does_save)
void trace_save_ctf(const char *dirname, int target_does_save)
int get_tracepoint_number(void)
struct trace_status * current_trace_status(void)
int get_traceframe_number(void)
void free_uploaded_tps(struct uploaded_tp **utpp)
void free_uploaded_tsvs(struct uploaded_tsv **utsvp)
void gdb_printf(struct ui_file *stream, const char *format,...)