From: Mathieu Desnoyers Date: Mon, 16 May 2016 14:40:32 +0000 (-0400) Subject: Fix: add "has_build_id" and "has_debug_link" fields to debuginfo events X-Git-Tag: v2.8.0~14 X-Git-Url: https://git.lttng.org/?p=lttng-ust.git;a=commitdiff_plain;h=a435064bcf001da9bfee85cb6274cf21ad33613d Fix: add "has_build_id" and "has_debug_link" fields to debuginfo events This allows trace analyzers to know whether they should expect the build id or debug link events following the bin_info event. Signed-off-by: Mathieu Desnoyers --- diff --git a/liblttng-ust-dl/lttng-ust-dl.c b/liblttng-ust-dl/lttng-ust-dl.c index ac3c951f..e4cb4206 100644 --- a/liblttng-ust-dl/lttng-ust-dl.c +++ b/liblttng-ust-dl/lttng-ust-dl.c @@ -104,7 +104,8 @@ void lttng_ust_dl_dlopen(void *so_base, const char *so_name, void *ip) } tracepoint(lttng_ust_dl, dlopen, - ip, so_base, resolved_path, memsz); + ip, so_base, resolved_path, memsz, + has_build_id, has_debug_link); if (has_build_id) { tracepoint(lttng_ust_dl, build_id, diff --git a/liblttng-ust-dl/ust_dl.h b/liblttng-ust-dl/ust_dl.h index 72b23ac5..24c9b70f 100644 --- a/liblttng-ust-dl/ust_dl.h +++ b/liblttng-ust-dl/ust_dl.h @@ -39,11 +39,14 @@ extern "C" { TRACEPOINT_EVENT(lttng_ust_dl, dlopen, TP_ARGS(void *, ip, void *, baddr, const char*, path, - uint64_t, memsz), + uint64_t, memsz, uint8_t, has_build_id, + uint8_t, has_debug_link), TP_FIELDS( ctf_integer_hex(void *, baddr, baddr) ctf_integer(uint64_t, memsz, memsz) ctf_string(path, path) + ctf_integer(uint8_t, has_build_id, has_build_id) + ctf_integer(uint8_t, has_debug_link, has_debug_link) ) ) diff --git a/liblttng-ust/lttng-ust-statedump-provider.h b/liblttng-ust/lttng-ust-statedump-provider.h index 9f1f74c5..b6a6f7e5 100644 --- a/liblttng-ust/lttng-ust-statedump-provider.h +++ b/liblttng-ust/lttng-ust-statedump-provider.h @@ -49,13 +49,17 @@ TRACEPOINT_EVENT(lttng_ust_statedump, bin_info, void *, baddr, const char*, path, uint64_t, memsz, - uint8_t, is_pic + uint8_t, is_pic, + uint8_t, has_build_id, + uint8_t, has_debug_link ), TP_FIELDS( ctf_integer_hex(void *, baddr, baddr) ctf_integer(uint64_t, memsz, memsz) ctf_string(path, path) ctf_integer(uint8_t, is_pic, is_pic) + ctf_integer(uint8_t, has_build_id, has_build_id) + ctf_integer(uint8_t, has_debug_link, has_debug_link) ) ) diff --git a/liblttng-ust/lttng-ust-statedump.c b/liblttng-ust/lttng-ust-statedump.c index c676a345..c2926aec 100644 --- a/liblttng-ust/lttng-ust-statedump.c +++ b/liblttng-ust/lttng-ust-statedump.c @@ -53,6 +53,8 @@ struct bin_info_data { int vdso; uint32_t crc; uint8_t is_pic; + uint8_t has_build_id; + uint8_t has_debug_link; }; typedef void (*tracepoint_cb)(struct lttng_session *session, void *priv); @@ -85,7 +87,9 @@ void trace_bin_info_cb(struct lttng_session *session, void *priv) tracepoint(lttng_ust_statedump, bin_info, session, bin_data->base_addr_ptr, - bin_data->resolved_path, bin_data->memsz, bin_data->is_pic); + bin_data->resolved_path, bin_data->memsz, + bin_data->is_pic, bin_data->has_build_id, + bin_data->has_debug_link); } static @@ -121,10 +125,10 @@ void trace_end_cb(struct lttng_session *session, void *priv) } static -int get_elf_info(struct bin_info_data *bin_data, int *has_build_id, - int *has_debug_link) { +int get_elf_info(struct bin_info_data *bin_data) +{ struct lttng_ust_elf *elf; - int ret = 0; + int ret = 0, found; elf = lttng_ust_elf_create(bin_data->resolved_path); if (!elf) { @@ -137,16 +141,22 @@ int get_elf_info(struct bin_info_data *bin_data, int *has_build_id, goto end; } + found = 0; ret = lttng_ust_elf_get_build_id(elf, &bin_data->build_id, - &bin_data->build_id_len, has_build_id); + &bin_data->build_id_len, + &found); if (ret) { goto end; } + bin_data->has_build_id = !!found; + found = 0; ret = lttng_ust_elf_get_debug_link(elf, &bin_data->dbg_file, - &bin_data->crc, has_debug_link); + &bin_data->crc, + &found); if (ret) { goto end; } + bin_data->has_debug_link = !!found; bin_data->is_pic = lttng_ust_elf_is_pic(elf); @@ -158,10 +168,10 @@ end: static int trace_baddr(struct bin_info_data *bin_data) { - int ret = 0, has_build_id = 0, has_debug_link = 0; + int ret = 0; if (!bin_data->vdso) { - ret = get_elf_info(bin_data, &has_build_id, &has_debug_link); + ret = get_elf_info(bin_data); if (ret) { goto end; } @@ -177,7 +187,7 @@ int trace_baddr(struct bin_info_data *bin_data) goto end; } - if (has_build_id) { + if (bin_data->has_build_id) { ret = trace_statedump_event( trace_build_id_cb, bin_data->owner, bin_data); free(bin_data->build_id); @@ -186,7 +196,7 @@ int trace_baddr(struct bin_info_data *bin_data) } } - if (has_debug_link) { + if (bin_data->has_debug_link) { ret = trace_statedump_event( trace_debug_link_cb, bin_data->owner, bin_data); free(bin_data->dbg_file);