From ca09ce902c17c2bffc02bfafaf0844204ac13333 Mon Sep 17 00:00:00 2001 From: Christopher Ferris Date: Tue, 31 Mar 2015 17:28:22 -0700 Subject: Discards frames for code within library. When doing a local unwind, do not include the frames that come from either libunwind or libbacktrace. Bug: 11518609 Change-Id: I0ec8d823aebbfa0903e61b16b7e5663f3fd65e78 --- libbacktrace/backtrace_test.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'libbacktrace/backtrace_test.cpp') diff --git a/libbacktrace/backtrace_test.cpp b/libbacktrace/backtrace_test.cpp index d408856..5de80b1 100644 --- a/libbacktrace/backtrace_test.cpp +++ b/libbacktrace/backtrace_test.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#define _GNU_SOURCE 1 #include #include #include @@ -200,6 +201,23 @@ bool WaitForNonZero(int32_t* value, uint64_t seconds) { return false; } +TEST(libbacktrace, local_no_unwind_frames) { + // Verify that a local unwind does not include any frames within + // libunwind or libbacktrace. + std::unique_ptr backtrace(Backtrace::Create(getpid(), getpid())); + ASSERT_TRUE(backtrace->Unwind(0)); + + ASSERT_TRUE(backtrace->NumFrames() != 0); + for (const auto& frame : *backtrace ) { + if (BacktraceMap::IsValid(frame.map)) { + const std::string name = basename(frame.map.name.c_str()); + ASSERT_TRUE(name != "libunwind.so" && name != "libbacktrace.so") + << DumpFrames(backtrace.get()); + } + break; + } +} + TEST(libbacktrace, local_trace) { ASSERT_NE(test_level_one(1, 2, 3, 4, VerifyLevelBacktrace, nullptr), 0); } -- cgit v1.1