diff options
Diffstat (limited to 'poky/meta/recipes-kernel/lttng/lttng-tools/gcc13-ptest-fix.patch')
-rw-r--r-- | poky/meta/recipes-kernel/lttng/lttng-tools/gcc13-ptest-fix.patch | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/poky/meta/recipes-kernel/lttng/lttng-tools/gcc13-ptest-fix.patch b/poky/meta/recipes-kernel/lttng/lttng-tools/gcc13-ptest-fix.patch new file mode 100644 index 0000000000..52c4ec9f8e --- /dev/null +++ b/poky/meta/recipes-kernel/lttng/lttng-tools/gcc13-ptest-fix.patch @@ -0,0 +1,107 @@ +From 844be4dc46deeec83199da80e9e2a6058e9f5a53 Mon Sep 17 00:00:00 2001 +From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= + <jeremie.galarneau@efficios.com> +Date: Thu, 25 May 2023 19:15:20 -0400 +Subject: [PATCH] Tests fix: test_callstack: output of addr2line incorrectly + parsed +MIME-Version: 1.0 +Content-Type: text/plain; charset=utf8 +Content-Transfer-Encoding: 8bit + +Upstream-Status: Backport + +Issue observed +-------------- + +The test_callstack test fails with GCC 13.1 with the following output: + + Traceback (most recent call last): + File "/usr/lib/lttng-tools/ptest/tests/regression/././kernel//../../utils/parse-callstack.py", line 160, in <module> + main() + File "/usr/lib/lttng-tools/ptest/tests/regression/././kernel//../../utils/parse-callstack.py", line 155, in main + raise Exception('Expected function name not found in recorded callstack') + Exception: Expected function name not found in recorded callstack + ok 10 - Destroy session callstack + PASS: kernel/test_callstack 10 - Destroy session callstack + not ok 11 - Validate userspace callstack + FAIL: kernel/test_callstack 11 - Validate userspace callstack + +Cause +----- + +parse-callstack.py uses 'split()' to split the lines of addr2line's +output. By default, 'split()' splits a string on any whitespace. +Typically this was fine as addr2line's output doesn't contain spaces and +the function then splits on new lines. + +Typical output of addr2line: + + $ addr2line -e ./tests/regression/kernel//../../utils/testapp/gen-syscall-events-callstack/gen-syscall-events-callstack --functions --addresses 0x40124B + 0x000000000040124b + my_gettid + /tmp/test-callstack-master/src/lttng-tools/tests/utils/testapp/gen-syscall-events-callstack/gen-syscall-events-callstack.c:40 + +However, with the test app compiled using gcc 13.1, a "discriminator" +annotation is present: + + 0x0000000000401279 + fct_b + /tmp/test-callstack-master/src/lttng-tools/tests/utils/testapp/gen-syscall-events-callstack/gen-syscall-events-callstack.c:58 (discriminator 1) + +Hence, by selecting the second to last element (-2, with negative +indexing), the addr2line function returns '(discriminator' as the +function name. + +Solution +-------- + +The parsing code is changed to simply iterate on groups of 3 lines, +following addr2line's output format. + +Fixes #1377 + +Change-Id: I8c1eab97e84ca7cad171904bed6660540061cf08 +Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com> +--- + tests/utils/parse-callstack.py | 25 +++++++++++++++++-------- + 1 file changed, 17 insertions(+), 8 deletions(-) + +diff --git a/tests/utils/parse-callstack.py b/tests/utils/parse-callstack.py +index c3f0e2e9bc..029100b618 100755 +--- a/tests/utils/parse-callstack.py ++++ b/tests/utils/parse-callstack.py +@@ -26,14 +26,23 @@ def addr2line(executable, addr): + + status = subprocess.run(cmd, stdout=subprocess.PIPE, check=True) + +- addr2line_output = status.stdout.decode("utf-8") +- +- # Omit the last 2 lines as the caller of main can not be determine +- fcts = [addr2line_output.split()[-2]] +- +- fcts = [ f for f in fcts if '??' not in f] +- +- return fcts ++ addr2line_output = status.stdout.decode("utf-8").splitlines() ++ # addr2line's output is made of 3-tuples: ++ # - address ++ # - function name ++ # - source location ++ if len(addr2line_output) % 3 != 0: ++ raise Exception('Unexpected addr2line output:\n\t{}'.format('\n\t'.join(addr2line_output))) ++ ++ function_names = [] ++ for address_line_number in range(0, len(addr2line_output), 3): ++ function_name = addr2line_output[address_line_number + 1] ++ ++ # Filter-out unresolved functions ++ if "??" not in function_name: ++ function_names.append(addr2line_output[address_line_number + 1]) ++ ++ return function_names + + def extract_user_func_names(executable, raw_callstack): + """ +-- +2.34.1 + |