mirror of
https://github.com/gperftools/gperftools
synced 2025-02-16 11:47:07 +00:00
stacktrace_unittest: test all stacktrace capturing methods
This commit is contained in:
parent
4dc313870c
commit
4d1a9e9226
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user