#include #include #include #include #include #include #include namespace NYT::NBacktrace { namespace { //////////////////////////////////////////////////////////////////////////////// template Y_NO_INLINE void RunInDeepStack(TFn cb) { if constexpr (Depth == 0) { cb(); } else { std::vector touchMem; touchMem.push_back(0); RunInDeepStack(cb); DoNotOptimizeAway(touchMem); } } TEST(TFramePointerCursor, FramePointerCursor) { std::vector backtrace; RunInDeepStack<64>([&] { unw_context_t unwContext; ASSERT_TRUE(unw_getcontext(&unwContext) == 0); unw_cursor_t unwCursor; ASSERT_TRUE(unw_init_local(&unwCursor, &unwContext) == 0); TSafeMemoryReader reader; auto fpCursorContext = NBacktrace::FramePointerCursorContextFromLibunwindCursor(unwCursor); NBacktrace::TFramePointerCursor fpCursor(&reader, fpCursorContext); while (!fpCursor.IsFinished()) { backtrace.push_back(fpCursor.GetCurrentIP()); fpCursor.MoveNext(); } }); ASSERT_THAT(backtrace, testing::SizeIs(testing::Ge(64u))); } //////////////////////////////////////////////////////////////////////////////// } // namespace } // namespace NYT::NBacktrace