From eea13a16a5f15344c1417f5f6fea2552f9f9d9a6 Mon Sep 17 00:00:00 2001 From: meteors117 Date: Wed, 20 Aug 2025 17:22:26 +0800 Subject: [PATCH] [stack_printer] Make GetFullStack flexible Fix to print single stack not all stacks to make function GetFullStack more flexible. Signed-off-by: meteors117 Change-Id: I7b94fb84e5d55dd83f6b6ef231371c84abd958d1 --- .../stack_printer/include/stack_printer.h | 6 ++-- .../stack_printer/src/stack_printer.cpp | 28 ++++++------------- .../stack_printer/stack_printer_test.cpp | 7 +++-- 3 files changed, 17 insertions(+), 24 deletions(-) diff --git a/interfaces/innerkits/stack_printer/include/stack_printer.h b/interfaces/innerkits/stack_printer/include/stack_printer.h index e34a72331..ad3f13469 100644 --- a/interfaces/innerkits/stack_printer/include/stack_printer.h +++ b/interfaces/innerkits/stack_printer/include/stack_printer.h @@ -77,10 +77,10 @@ public: /** * @brief Get the sampled stack string listed by time order. * - * @param timeStampedPcsVec the vector of sampled stack pcs with its timestamp. - * @return the string of the sampled stack, listed by time order. + * @param timeStampedPcs the vector of pcs with timestamp of sampled stack. + * @return the string of the sampled stack. */ - std::string GetFullStack(const std::vector& timeStampedPcsVec); + std::string GetFullStack(const TimeStampedPcs& timeStampedPcs); /** * @brief Get the SampledFrames with tids into map, which can be serialize to bytes and deserialize back to map. diff --git a/interfaces/innerkits/stack_printer/src/stack_printer.cpp b/interfaces/innerkits/stack_printer/src/stack_printer.cpp index 275b9750b..5e012ddcb 100644 --- a/interfaces/innerkits/stack_printer/src/stack_printer.cpp +++ b/interfaces/innerkits/stack_printer/src/stack_printer.cpp @@ -132,7 +132,7 @@ public: bool InitUniqueTable(pid_t pid, uint32_t size, std::string name = "unique_stack_table"); bool PutPcsInTable(const std::vector& pcs, int tid, uint64_t snapshotTime); - std::string GetFullStack(const std::vector& timeStampedPcsVec); + std::string GetFullStack(const TimeStampedPcs& timeStampedPcs); std::map> GetThreadSampledFrames(uint64_t beginTime = 0, uint64_t endTime = 0); std::string GetTreeStack(int tid, bool printTimes = false, uint64_t beginTime = 0, uint64_t endTime = 0); std::string GetHeaviestStack(int tid, uint64_t beginTime = 0, uint64_t endTime = 0); @@ -179,9 +179,9 @@ bool StackPrinter::PutPcsInTable(const std::vector& pcs, int tid, uin return impl_->PutPcsInTable(pcs, tid, snapshotTime); } -std::string StackPrinter::GetFullStack(const std::vector& timeStampedPcsVec) +std::string StackPrinter::GetFullStack(const TimeStampedPcs& timeStampedPcs) { - return impl_->GetFullStack(timeStampedPcsVec); + return impl_->GetFullStack(timeStampedPcs); } std::map> StackPrinter::GetThreadSampledFrames(uint64_t beginTime, uint64_t endTime) @@ -340,16 +340,13 @@ bool StackPrinter::Impl::PutPcsInTable(const std::vector& pcs, int ti return true; } -std::string StackPrinter::Impl::GetFullStack(const std::vector& timeStampedPcsVec) +std::string StackPrinter::Impl::GetFullStack(const TimeStampedPcs& timeStampedPcs) { std::stringstream stack; - for (const auto& timeStampedPcs : timeStampedPcsVec) { - std::string snapshotTimeStr = TimeFormat(timeStampedPcs.snapshotTime); - stack << "SnapshotTime:" << snapshotTimeStr << "\n"; - std::vector pcs = timeStampedPcs.pcVec; - stack << PrintStackByPcs(pcs, unwinder_, maps_); - stack << "\n"; + if (timeStampedPcs.snapshotTime != 0) { + stack << "SnapshotTime:" << TimeFormat(timeStampedPcs.snapshotTime) << "\n"; } + stack << PrintStackByPcs(timeStampedPcs.pcVec, unwinder_, maps_); return stack.str(); } @@ -550,19 +547,12 @@ std::map> StackPrinter::Impl::DeserializeSampledF } is.ignore(std::numeric_limits::max(), '\n'); for (size_t i = 0; i < mapSize; i++) { - std::string tidStr; + int tid; size_t vecSize; - if (!(is >> tidStr >> vecSize)) { + if (!(is >> tid >> vecSize)) { is.setstate(std::ios::failbit); return std::map>(); } - int base = 10; - char* endPtr; - long tidNum = std::strtol(tidStr.c_str(), &endPtr, base); - if (*endPtr != '\0' || tidNum < INT_MIN || tidNum > INT_MAX) { - return std::map>(); - } - int tid = static_cast(tidNum); std::vector sampledFrameVec; for (size_t j = 0; j < vecSize; j++) { SampledFrame frame; diff --git a/test/unittest/stack_printer/stack_printer_test.cpp b/test/unittest/stack_printer/stack_printer_test.cpp index 84dede21c..151afb1f7 100644 --- a/test/unittest/stack_printer/stack_printer_test.cpp +++ b/test/unittest/stack_printer/stack_printer_test.cpp @@ -641,7 +641,10 @@ HWTEST_F(StackPrinterTest, StackPrinterTest_003, TestSize.Level2) std::shared_ptr unwinder = std::make_shared(false); std::shared_ptr maps = DfxMaps::Create(getpid(), MAPS_PATH); stackPrinter->SetUnwindInfo(unwinder, maps); - std::string stack = stackPrinter->GetFullStack(timeStampedPcsVec); + std::string stack; + for (auto timeStampedPcs : timeStampedPcsVec) { + stack += stackPrinter->GetFullStack(timeStampedPcs); + } ASSERT_NE(stack, ""); GTEST_LOG_(INFO) << "stack:\n" << stack.c_str() << "\n"; GTEST_LOG_(INFO) << "StackPrinterTest_003: end.\n"; @@ -908,7 +911,7 @@ HWTEST_F(StackPrinterTest, StackPrinterTest_010, TestSize.Level2) ss.clear(); ss.str("1\ninvalidTid 1"); result = StackPrinter::DeserializeSampledFrameMap(ss); - ASSERT_FALSE(ss.fail()); + ASSERT_TRUE(ss.fail()); ASSERT_TRUE(result.empty()); ss.str(""); -- Gitee