X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=lib%2Fdebuginfo.c;h=517e1bcac8dc25d55b8d31d9661e16c1cf11cfac;hp=4284f8e15d1d47e0d47029d355895983f0bf4371;hb=458af89d3baff393a4c38f70520fb51b811ad932;hpb=3be1e3c98864ad12cab2e53c42db5252193367f5 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);