stacktrace_unittest: test all stacktrace capturing methods

This commit is contained in:
Aliaksey Kandratsenka 2023-10-23 10:14:16 -04:00
parent 4dc313870c
commit 4d1a9e9226
4 changed files with 68 additions and 18 deletions

View File

@ -652,10 +652,10 @@ if(WITH_STACK_TRACE)
src/base/commandlineflags.h
${STACKTRACE_INCLUDES}
${LOGGING_INCLUDES})
set(stacktrace_unittest_SOURCES src/tests/stacktrace_unittest.cc
${STACKTRACE_UNITTEST_INCLUDES})
add_executable(stacktrace_unittest ${stacktrace_unittest_SOURCES})
target_link_libraries(stacktrace_unittest stacktrace logging fake_stacktrace_scope)
add_executable(stacktrace_unittest src/tests/stacktrace_unittest.cc ${libstacktrace_la_SOURCES})
target_link_libraries(stacktrace_unittest logging fake_stacktrace_scope ${LIBSPINLOCK} ${unwind_libs})
target_compile_definitions(stacktrace_unittest PRIVATE STACKTRACE_IS_TESTED)
add_test(stacktrace_unittest stacktrace_unittest)
add_executable(check_address_unittest src/tests/check_address_test.cc)

View File

@ -322,8 +322,10 @@ STACKTRACE_UNITTEST_INCLUDES = src/config_for_unittests.h \
$(STACKTRACE_INCLUDES) \
$(LOGGING_INCLUDES)
stacktrace_unittest_SOURCES = src/tests/stacktrace_unittest.cc \
$(libstacktrace_la_SOURCES) \
$(STACKTRACE_UNITTEST_INCLUDES)
stacktrace_unittest_LDADD = libstacktrace.la liblogging.la libfake_stacktrace_scope.la $(STACKTRACE_UNITTEST_LIBS)
stacktrace_unittest_CXXFLAGS = $(AM_CXXFLAGS) -DSTACKTRACE_IS_TESTED
stacktrace_unittest_LDADD = $(libstacktrace_la_LIBADD) liblogging.la libfake_stacktrace_scope.la $(STACKTRACE_UNITTEST_LIBS)
# nice to have. Allows glibc's backtrace_symbols to work.
stacktrace_unittest_LDFLAGS = -export-dynamic

View File

@ -366,6 +366,46 @@ PERFTOOLS_DLL_DECL int GetStackTraceWithContext(void** result, int max_depth,
skip_count, uc);
}
#if STACKTRACE_IS_TESTED
static void init_default_stack_impl_inner() {
}
extern "C" {
const char* TEST_bump_stacktrace_implementation(const char* suggestion) {
static int selection;
constexpr int n = sizeof(all_impls)/sizeof(all_impls[0]);
if (!get_stack_impl_inited) {
fprintf(stderr, "Supported stacktrace methods:\n");
for (int i = 0; i < n; i++) {
fprintf(stderr, "* %s\n", all_impls[i]->name);
}
fprintf(stderr, "\n\n");
get_stack_impl_inited = true;
}
do {
if (selection == n) {
return nullptr;
}
get_stack_impl = all_impls[selection++];
if (suggestion && strcmp(suggestion, get_stack_impl->name) != 0) {
continue;
}
if (get_stack_impl == &impl__null) {
// skip null implementation
continue;
}
break;
} while (true);
return get_stack_impl->name;
}
}
#else // !STACKTRACE_IS_TESTED
ATTRIBUTE_NOINLINE
static void maybe_convert_libunwind_to_generic_fp() {
#if defined(HAVE_GST_libunwind) && defined(HAVE_GST_generic_fp)
@ -425,3 +465,5 @@ static void init_default_stack_impl(void) {
}
REGISTER_MODULE_INITIALIZER(stacktrace_init_default_stack_impl, init_default_stack_impl());
#endif // !STACKTRACE_IS_TESTED

View File

@ -59,13 +59,6 @@
#include <gperftools/stacktrace.h>
#include "tests/testutil.h"
static bool verbosity_setup = ([] () {
// Lets try have more details printed for test by asking for verbose
// option.
setenv("TCMALLOC_STACKTRACE_METHOD_VERBOSE", "t", 0);
return true;
})();
// Obtain a backtrace, verify that the expected callers are present in the
// backtrace, and maybe print the backtrace to stdout.
@ -374,13 +367,26 @@ void RunTest() {
#endif // TEST_UCONTEXT_BITS
}
int main(int argc, char ** argv) {
leaf_capture_len = 20;
RunTest();
extern "C" {
const char* TEST_bump_stacktrace_implementation(const char*);
}
printf("\nSet max capture length to 3:\n");
leaf_capture_len = 3; // less than stack depth
RunTest();
int main(int argc, char** argv) {
for (;;) {
// first arg if given is stacktrace implementation we want to test
const char* name = TEST_bump_stacktrace_implementation((argc > 1) ? argv[1] : nullptr);
if (!name) {
break;
}
printf("Testing stacktrace implementation: %s\n", name);
leaf_capture_len = 20;
RunTest();
printf("\nSet max capture length to 3:\n");
leaf_capture_len = 3; // less than stack depth
RunTest();
}
return 0;
}