mirror of
https://github.com/torvalds/linux.git
synced 2024-11-30 16:11:38 +00:00
perf build-ids: Fall back to debuginfod query if debuginfo not found
During a perf-record, use the -ldebuginfod API to query a debuginfod server, should the debug data not be found in the usual system locations. If successful, the usual $HOME/.debug dir is populated. Tested with: $ find . . ./ctags-debuginfo-5.8-26.fc31.x86_64.rpm ./usr ./usr/lib ./usr/lib/debug ./usr/lib/debug/.build-id ./usr/lib/debug/.build-id/ca ./usr/lib/debug/.build-id/ca/46f6ae6a0cee57d85abc1d461c49074248908d ./usr/lib/debug/.build-id/ca/46f6ae6a0cee57d85abc1d461c49074248908d.debug ./usr/lib/debug/usr ./usr/lib/debug/usr/bin ./usr/lib/debug/usr/bin/ctags-5.8-26.fc31.x86_64.debug $ debuginfod -F . ... $ rm -rf ~/.debug/ ; mkdir ~/.debug $ perf record make tags BUILD: Doing 'make -j8' parallel build GEN tags [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.107 MB perf.data (1483 samples) ] $ find ~/.debug | grep ctags /home/jolsa/.debug/usr/bin/ctags /home/jolsa/.debug/usr/bin/ctags/ca46f6ae6a0cee57d85abc1d461c49074248908d /home/jolsa/.debug/usr/bin/ctags/ca46f6ae6a0cee57d85abc1d461c49074248908d/elf /home/jolsa/.debug/usr/bin/ctags/ca46f6ae6a0cee57d85abc1d461c49074248908d/probes $ rm -rf ~/.debug/ ; mkdir ~/.debug $ DEBUGINFOD_URLS=http://localhost:8002 perf record make tags BUILD: Doing 'make -j8' parallel build GEN tags [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.108 MB perf.data (1531 samples) ] $ find ~/.debug | grep ctag /home/jolsa/.debug/usr/bin/ctags /home/jolsa/.debug/usr/bin/ctags/ca46f6ae6a0cee57d85abc1d461c49074248908d /home/jolsa/.debug/usr/bin/ctags/ca46f6ae6a0cee57d85abc1d461c49074248908d/debug /home/jolsa/.debug/usr/bin/ctags/ca46f6ae6a0cee57d85abc1d461c49074248908d/elf /home/jolsa/.debug/usr/bin/ctags/ca46f6ae6a0cee57d85abc1d461c49074248908d/probes Note the 'debug' file is created in the last run. Note that currently the debuginfo data are downloaded only on record path, we still need add this support to perf build-id/report.. and test ;-) Tested-by: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Frank Ch. Eigler <fche@redhat.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
a508d061ef
commit
c7a14fdcb3
@ -98,7 +98,8 @@ FEATURE_TESTS_EXTRA := \
|
|||||||
llvm-version \
|
llvm-version \
|
||||||
clang \
|
clang \
|
||||||
libbpf \
|
libbpf \
|
||||||
libpfm4
|
libpfm4 \
|
||||||
|
libdebuginfod
|
||||||
|
|
||||||
FEATURE_TESTS ?= $(FEATURE_TESTS_BASIC)
|
FEATURE_TESTS ?= $(FEATURE_TESTS_BASIC)
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ FILES= \
|
|||||||
test-libelf-gelf_getnote.bin \
|
test-libelf-gelf_getnote.bin \
|
||||||
test-libelf-getshdrstrndx.bin \
|
test-libelf-getshdrstrndx.bin \
|
||||||
test-libelf-mmap.bin \
|
test-libelf-mmap.bin \
|
||||||
|
test-libdebuginfod.bin \
|
||||||
test-libnuma.bin \
|
test-libnuma.bin \
|
||||||
test-numa_num_possible_cpus.bin \
|
test-numa_num_possible_cpus.bin \
|
||||||
test-libperl.bin \
|
test-libperl.bin \
|
||||||
@ -157,6 +158,9 @@ $(OUTPUT)test-libelf-gelf_getnote.bin:
|
|||||||
$(OUTPUT)test-libelf-getshdrstrndx.bin:
|
$(OUTPUT)test-libelf-getshdrstrndx.bin:
|
||||||
$(BUILD) -lelf
|
$(BUILD) -lelf
|
||||||
|
|
||||||
|
$(OUTPUT)test-libdebuginfod.bin:
|
||||||
|
$(BUILD) -ldebuginfod
|
||||||
|
|
||||||
$(OUTPUT)test-libnuma.bin:
|
$(OUTPUT)test-libnuma.bin:
|
||||||
$(BUILD) -lnuma
|
$(BUILD) -lnuma
|
||||||
|
|
||||||
|
8
tools/build/feature/test-libdebuginfod.c
Normal file
8
tools/build/feature/test-libdebuginfod.c
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
#include <elfutils/debuginfod.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
debuginfod_client* c = debuginfod_begin();
|
||||||
|
return (long)c;
|
||||||
|
}
|
@ -501,6 +501,14 @@ ifndef NO_LIBELF
|
|||||||
CFLAGS += -DHAVE_ELF_GETSHDRSTRNDX_SUPPORT
|
CFLAGS += -DHAVE_ELF_GETSHDRSTRNDX_SUPPORT
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifndef NO_LIBDEBUGINFOD
|
||||||
|
$(call feature_check,libdebuginfod)
|
||||||
|
ifeq ($(feature-libdebuginfod), 1)
|
||||||
|
CFLAGS += -DHAVE_DEBUGINFOD_SUPPORT
|
||||||
|
EXTLIBS += -ldebuginfod
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
ifndef NO_DWARF
|
ifndef NO_DWARF
|
||||||
ifeq ($(origin PERF_HAVE_DWARF_REGS), undefined)
|
ifeq ($(origin PERF_HAVE_DWARF_REGS), undefined)
|
||||||
msg := $(warning DWARF register mappings have not been defined for architecture $(SRCARCH), DWARF support disabled);
|
msg := $(warning DWARF register mappings have not been defined for architecture $(SRCARCH), DWARF support disabled);
|
||||||
|
@ -124,6 +124,8 @@ include ../scripts/utilities.mak
|
|||||||
#
|
#
|
||||||
# Define LIBPFM4 to enable libpfm4 events extension.
|
# Define LIBPFM4 to enable libpfm4 events extension.
|
||||||
#
|
#
|
||||||
|
# Define NO_LIBDEBUGINFOD if you do not want support debuginfod
|
||||||
|
#
|
||||||
|
|
||||||
# As per kernel Makefile, avoid funny character set dependencies
|
# As per kernel Makefile, avoid funny character set dependencies
|
||||||
unexport LC_ALL
|
unexport LC_ALL
|
||||||
|
@ -31,6 +31,10 @@
|
|||||||
#include "probe-file.h"
|
#include "probe-file.h"
|
||||||
#include "strlist.h"
|
#include "strlist.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_DEBUGINFOD_SUPPORT
|
||||||
|
#include <elfutils/debuginfod.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <linux/ctype.h>
|
#include <linux/ctype.h>
|
||||||
#include <linux/zalloc.h>
|
#include <linux/zalloc.h>
|
||||||
|
|
||||||
@ -636,6 +640,21 @@ static char *build_id_cache__find_debug(const char *sbuild_id,
|
|||||||
if (realname && access(realname, R_OK))
|
if (realname && access(realname, R_OK))
|
||||||
zfree(&realname);
|
zfree(&realname);
|
||||||
nsinfo__mountns_exit(&nsc);
|
nsinfo__mountns_exit(&nsc);
|
||||||
|
|
||||||
|
#ifdef HAVE_DEBUGINFOD_SUPPORT
|
||||||
|
if (realname == NULL) {
|
||||||
|
debuginfod_client* c = debuginfod_begin();
|
||||||
|
if (c != NULL) {
|
||||||
|
int fd = debuginfod_find_debuginfo(c,
|
||||||
|
(const unsigned char*)sbuild_id, 0,
|
||||||
|
&realname);
|
||||||
|
if (fd >= 0)
|
||||||
|
close(fd); /* retaining reference by realname */
|
||||||
|
debuginfod_end(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
out:
|
out:
|
||||||
free(debugfile);
|
free(debugfile);
|
||||||
return realname;
|
return realname;
|
||||||
|
Loading…
Reference in New Issue
Block a user