X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=converter%2Fbabeltrace.c;h=ef783ed495a3f35295de62f6a0f71261ac216b98;hb=c8a683194ae8caef6592cd235bf1666001d8d4cd;hp=8921d5ab59d660d7913fa7078db4362db503fbe8;hpb=887d00c37959fab79628f4a63935156b549b0a82;p=babeltrace.git diff --git a/converter/babeltrace.c b/converter/babeltrace.c index 8921d5ab..ef783ed4 100644 --- a/converter/babeltrace.c +++ b/converter/babeltrace.c @@ -36,6 +36,8 @@ #include #include #include +#include + #include #include #include @@ -70,10 +72,16 @@ static char *opt_input_format, *opt_output_format; */ static GPtrArray *opt_input_paths; static char *opt_output_path; -int opt_stream_intersection; +static int opt_stream_intersection; static struct bt_format *fmt_read; +void bt_dummy_hook(void); +void bt_lttng_live_hook(void); +void bt_ctf_hook(void); +void bt_ctf_text_hook(void); +void bt_ctf_metadata_hook(void); + static void strlower(char *str) { @@ -103,6 +111,9 @@ enum { OPT_CLOCK_GMT, OPT_CLOCK_FORCE_CORRELATE, OPT_STREAM_INTERSECTION, + OPT_DEBUG_INFO_DIR, + OPT_DEBUG_INFO_FULL_PATH, + OPT_DEBUG_INFO_TARGET_PREFIX, }; /* @@ -133,6 +144,11 @@ static struct poptOption long_options[] = { { "clock-gmt", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_GMT, NULL, NULL }, { "clock-force-correlate", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_FORCE_CORRELATE, NULL, NULL }, { "stream-intersection", 0, POPT_ARG_NONE, NULL, OPT_STREAM_INTERSECTION, NULL, NULL }, +#ifdef ENABLE_DEBUG_INFO + { "debug-info-dir", 0, POPT_ARG_STRING, NULL, OPT_DEBUG_INFO_DIR, NULL, NULL }, + { "debug-info-full-path", 0, POPT_ARG_NONE, NULL, OPT_DEBUG_INFO_FULL_PATH, NULL, NULL }, + { "debug-info-target-prefix", 0, POPT_ARG_STRING, NULL, OPT_DEBUG_INFO_TARGET_PREFIX, NULL, NULL }, +#endif { NULL, 0, 0, NULL, 0, NULL, NULL }, }; @@ -179,6 +195,12 @@ static void usage(FILE *fp) fprintf(fp, " --clock-force-correlate Assume that clocks are inherently correlated\n"); fprintf(fp, " across traces.\n"); fprintf(fp, " --stream-intersection Only print events when all streams are active.\n"); +#ifdef ENABLE_DEBUG_INFO + fprintf(fp, " --debug-info-dir Directory in which to look for debugging information\n"); + fprintf(fp, " files. (default: /usr/lib/debug/)\n"); + fprintf(fp, " --debug-info-target-prefix Directory to use as a prefix for executable lookup\n"); + fprintf(fp, " --debug-info-full-path Show full debug info source and binary paths (if available)\n"); +#endif list_formats(fp); fprintf(fp, "\n"); } @@ -401,7 +423,23 @@ static int parse_options(int argc, char **argv) case OPT_STREAM_INTERSECTION: opt_stream_intersection = 1; break; - + case OPT_DEBUG_INFO_DIR: + opt_debug_info_dir = (char *) poptGetOptArg(pc); + if (!opt_debug_info_dir) { + ret = -EINVAL; + goto end; + } + break; + case OPT_DEBUG_INFO_FULL_PATH: + opt_debug_info_full_path = 1; + break; + case OPT_DEBUG_INFO_TARGET_PREFIX: + opt_debug_info_target_prefix = (char *) poptGetOptArg(pc); + if (!opt_debug_info_target_prefix) { + ret = -EINVAL; + goto end; + } + break; default: ret = -EINVAL; goto end; @@ -622,47 +660,16 @@ end: return ret; } -static -struct bt_ctf_iter *iter_create_intersect(struct bt_context *ctx, - struct bt_iter_pos *inter_begin_pos, - struct bt_iter_pos *inter_end_pos) -{ - uint64_t begin = 0, end = ULLONG_MAX; - int ret; - - ret = ctf_find_packets_intersection(ctx, &begin, &end); - if (ret == 1) { - fprintf(stderr, "[error] No intersection found between trace files.\n"); - ret = -1; - goto error; - } else if (ret != 0) { - goto error; - } - inter_begin_pos = bt_iter_create_time_pos(NULL, begin); - if (!inter_begin_pos) { - goto error; - } - inter_end_pos = bt_iter_create_time_pos(NULL, end); - if (!inter_end_pos) { - goto error; - } - - return bt_ctf_iter_create(ctx, inter_begin_pos, - inter_end_pos); -error: - return NULL; -} - static int convert_trace(struct bt_trace_descriptor *td_write, struct bt_context *ctx) { struct bt_ctf_iter *iter; struct ctf_text_stream_pos *sout; - struct bt_iter_pos begin_pos; - struct bt_iter_pos *inter_begin_pos = NULL, *inter_end_pos = NULL; + struct bt_iter_pos *begin_pos = NULL, *end_pos = NULL; struct bt_ctf_event *ctf_event; int ret; + int error_holder = 0; sout = container_of(td_write, struct ctf_text_stream_pos, trace_descriptor); @@ -672,10 +679,11 @@ int convert_trace(struct bt_trace_descriptor *td_write, } if (opt_stream_intersection) { - iter = iter_create_intersect(ctx, inter_begin_pos, inter_end_pos); + iter = bt_ctf_iter_create_intersect(ctx, &begin_pos, &end_pos); } else { - begin_pos.type = BT_SEEK_BEGIN; - iter = bt_ctf_iter_create(ctx, &begin_pos, NULL); + begin_pos = bt_iter_create_time_pos(NULL, 0); + begin_pos->type = BT_SEEK_BEGIN; + iter = bt_ctf_iter_create(ctx, begin_pos, NULL); } if (!iter) { ret = -1; @@ -688,24 +696,36 @@ int convert_trace(struct bt_trace_descriptor *td_write, goto end; } ret = bt_iter_next(bt_ctf_get_iter(iter)); - if (ret < 0) { + if (ret == -ERANGE) { + /* + * Remember that a range (truncated packet) + * error occurred and continue. + */ + error_holder = 1; + continue; + } else if (ret < 0) { goto end; } } - ret = 0; + ret = error_holder; end: bt_ctf_iter_destroy(iter); error_iter: - if (inter_begin_pos) { - bt_iter_free_pos(inter_begin_pos); - } - if (inter_end_pos) { - bt_iter_free_pos(inter_end_pos); - } + bt_iter_free_pos(begin_pos); + bt_iter_free_pos(end_pos); return ret; } +void call_plugins_hooks(void) +{ + bt_dummy_hook(); + bt_lttng_live_hook(); + bt_ctf_hook(); + bt_ctf_text_hook(); + bt_ctf_metadata_hook(); +} + int main(int argc, char **argv) { int ret, partial_error = 0, open_success = 0; @@ -714,6 +734,8 @@ int main(int argc, char **argv) struct bt_context *ctx; int i; + call_plugins_hooks(); + opt_input_paths = g_ptr_array_new(); ret = parse_options(argc, argv); @@ -856,6 +878,8 @@ end: free(opt_input_format); free(opt_output_format); free(opt_output_path); + free(opt_debug_info_dir); + free(opt_debug_info_target_prefix); g_ptr_array_free(opt_input_paths, TRUE); if (partial_error) exit(EXIT_FAILURE);