tests: Test libexecinfo backtrace call througth signal trampoline
It should fails on Aarch64 until https://reviews.llvm.org/D155066 is not merged. Reviewed by: Differential Revision: https://reviews.freebsd.org/D41129
This commit is contained in:
parent
4281dab8bc
commit
df1ea58873
@ -14,7 +14,10 @@ STRIP=
|
||||
# so that doesn't seem useful.
|
||||
NETBSD_ATF_TESTS_C+= backtrace_test
|
||||
|
||||
ATF_TESTS_C+= sigtramp_test
|
||||
|
||||
LIBADD.backtrace_test+= execinfo
|
||||
LIBADD.sigtramp_test+= execinfo
|
||||
|
||||
.include <netbsd-tests.test.mk>
|
||||
|
||||
|
75
lib/libexecinfo/tests/sigtramp_test.c
Normal file
75
lib/libexecinfo/tests/sigtramp_test.c
Normal file
@ -0,0 +1,75 @@
|
||||
/*-
|
||||
* Copyright (c) 2023 Dmitry Chagin <dchagin@FreeBSD.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include <execinfo.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <atf-c.h>
|
||||
|
||||
#define BT_FUNCTIONS 10
|
||||
|
||||
void handler(int);
|
||||
|
||||
__noinline void
|
||||
handler(int signum __unused)
|
||||
{
|
||||
void *addresses[BT_FUNCTIONS];
|
||||
char **symbols;
|
||||
size_t n, i, match;
|
||||
|
||||
n = backtrace(addresses, nitems(addresses));
|
||||
ATF_REQUIRE(n > 1);
|
||||
symbols = backtrace_symbols(addresses, n);
|
||||
ATF_REQUIRE(symbols != NULL);
|
||||
|
||||
match = -1;
|
||||
for (i = 0; i < n; i++) {
|
||||
printf("%zu: %p, %s\n", i, addresses[i], symbols[i]);
|
||||
if (strstr(symbols[i], "<main+") != NULL)
|
||||
match = i;
|
||||
}
|
||||
ATF_REQUIRE(match > 0);
|
||||
printf("match at %zu, symbols %zu\n", match, n);
|
||||
|
||||
}
|
||||
|
||||
ATF_TC_WITHOUT_HEAD(test_backtrace_sigtramp);
|
||||
ATF_TC_BODY(test_backtrace_sigtramp, tc)
|
||||
{
|
||||
struct sigaction act;
|
||||
pid_t child;
|
||||
int status;
|
||||
|
||||
memset(&act, 0, sizeof(act));
|
||||
act.sa_handler = handler;
|
||||
sigemptyset(&act.sa_mask);
|
||||
sigaction(SIGUSR1, &act, NULL);
|
||||
|
||||
child = fork();
|
||||
ATF_REQUIRE(child != -1);
|
||||
|
||||
if (child == 0) {
|
||||
kill(getppid(), SIGUSR1);
|
||||
_exit(0);
|
||||
} else
|
||||
wait(&status);
|
||||
}
|
||||
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
{
|
||||
|
||||
ATF_TP_ADD_TC(tp, test_backtrace_sigtramp);
|
||||
|
||||
return (atf_no_error());
|
||||
}
|
Loading…
Reference in New Issue
Block a user