From 458af89d3baff393a4c38f70520fb51b811ad932 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Fri, 15 Apr 2016 13:37:38 -0400 Subject: [PATCH] Add --debug-info-full-path option and shorten source name MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérémie Galarneau --- converter/babeltrace.c | 6 ++++ formats/ctf-text/ctf-text.c | 3 +- include/babeltrace/babeltrace-internal.h | 3 +- include/babeltrace/debuginfo.h | 2 ++ include/babeltrace/trace-debuginfo.h | 6 ++-- lib/debuginfo.c | 43 +++++++++++++++++++++++- 6 files changed, 58 insertions(+), 5 deletions(-) diff --git a/converter/babeltrace.c b/converter/babeltrace.c index 2718a461..f16e06c4 100644 --- a/converter/babeltrace.c +++ b/converter/babeltrace.c @@ -106,6 +106,7 @@ enum { OPT_CLOCK_FORCE_CORRELATE, OPT_STREAM_INTERSECTION, OPT_DEBUG_INFO_DIR, + OPT_DEBUG_INFO_FULL_PATH, }; /* @@ -138,6 +139,7 @@ static struct poptOption long_options[] = { { "stream-intersection", 0, POPT_ARG_NONE, NULL, OPT_STREAM_INTERSECTION, NULL, NULL }, #ifdef ENABLE_DEBUGINFO { "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 }, #endif { NULL, 0, 0, NULL, 0, NULL, NULL }, }; @@ -188,6 +190,7 @@ static void usage(FILE *fp) #ifdef ENABLE_DEBUGINFO 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-full-path Show full debug info source and binary paths (if available)\n"); #endif list_formats(fp); fprintf(fp, "\n"); @@ -418,6 +421,9 @@ static int parse_options(int argc, char **argv) goto end; } break; + case OPT_DEBUG_INFO_FULL_PATH: + opt_debug_info_full_path = 1; + break; default: ret = -EINVAL; goto end; diff --git a/formats/ctf-text/ctf-text.c b/formats/ctf-text/ctf-text.c index 00876233..afdc07c1 100644 --- a/formats/ctf-text/ctf-text.c +++ b/formats/ctf-text/ctf-text.c @@ -60,7 +60,8 @@ int opt_all_field_names, opt_loglevel_field, opt_emf_field, opt_callsite_field, - opt_delta_field = 1; + opt_delta_field = 1, + opt_debug_info_full_path; enum field_item { ITEM_SCOPE, diff --git a/include/babeltrace/babeltrace-internal.h b/include/babeltrace/babeltrace-internal.h index 9d252c8e..71c236a4 100644 --- a/include/babeltrace/babeltrace-internal.h +++ b/include/babeltrace/babeltrace-internal.h @@ -191,7 +191,8 @@ extern int opt_all_field_names, opt_clock_seconds, opt_clock_date, opt_clock_gmt, - opt_clock_force_correlate; + opt_clock_force_correlate, + opt_debug_info_full_path; extern uint64_t opt_clock_offset; extern uint64_t opt_clock_offset_ns; diff --git a/include/babeltrace/debuginfo.h b/include/babeltrace/debuginfo.h index 9d5a9ddb..9849685a 100644 --- a/include/babeltrace/debuginfo.h +++ b/include/babeltrace/debuginfo.h @@ -43,6 +43,8 @@ struct debug_info_source { char *func; uint64_t line_no; char *filename; + /* short_filename points inside filename, no need to free. */ + const char *short_filename; }; BT_HIDDEN diff --git a/include/babeltrace/trace-debuginfo.h b/include/babeltrace/trace-debuginfo.h index adbad09d..963ec97f 100644 --- a/include/babeltrace/trace-debuginfo.h +++ b/include/babeltrace/trace-debuginfo.h @@ -62,9 +62,11 @@ void ctf_text_integer_write_debug_info(struct bt_stream_pos *ppos, fprintf(pos->fp, ", "); } - fprintf(pos->fp, "source_loc = \"%s:%" PRIu64 + fprintf(pos->fp, "src = \"%s:%" PRIu64 "\"", - debug_info_src->filename, + opt_debug_info_full_path ? + debug_info_src->filename : + debug_info_src->short_filename, debug_info_src->line_no); } diff --git a/lib/debuginfo.c b/lib/debuginfo.c index 4284f8e1..517e1bca 100644 --- a/lib/debuginfo.c +++ b/lib/debuginfo.c @@ -4,6 +4,7 @@ * Copyright (c) 2015 EfficiOS Inc. and Linux Foundation * Copyright (c) 2015 Philippe Proulx * Copyright (c) 2015 Antoine Busque + * Copyright (c) 2016 Jérémie Galarneau * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -30,6 +31,7 @@ #include #include #include +#include struct proc_debug_info_sources { /* @@ -86,6 +88,37 @@ void debug_info_source_destroy(struct debug_info_source *debug_info_src) g_free(debug_info_src); } +/* + * Returns the location of a path's file (the last element of the path). + * Returns the original path on error. + */ +static +const char *get_filename_from_path(const char *path) +{ + size_t i = strlen(path); + + if (i == 0) { + goto end; + } + + if (path[i - 1] == '/') { + /* + * Path ends with a trailing slash, no filename to return. + * Return the original path. + */ + goto end; + } + + while (i-- > 0) { + if (path[i] == '/') { + path = &path[i + 1]; + goto end; + } + } +end: + return path; +} + static struct debug_info_source *debug_info_source_create_from_so(struct so_info *so, uint64_t ip) @@ -122,10 +155,18 @@ struct debug_info_source *debug_info_source_create_from_so(struct so_info *so, if (src_loc->filename) { debug_info_src->filename = strdup(src_loc->filename); - if (!debug_info_src->filename) { goto error; } + + /* + * The short version of the filename does not include + * the full path, it will only point to the last element + * of the path (anything after the last '/'). + */ + debug_info_src->short_filename = get_filename_from_path( + src_loc->filename); + } source_location_destroy(src_loc); -- 2.34.1