diff --git a/frameworks/native/appkit/dfr/appfreeze_inner.cpp b/frameworks/native/appkit/dfr/appfreeze_inner.cpp index 824d5a0e0968db6cbcd060783996471efae09553..aa789d672ada5c1b5c3ec1c9db3a7d922f376be5 100644 --- a/frameworks/native/appkit/dfr/appfreeze_inner.cpp +++ b/frameworks/native/appkit/dfr/appfreeze_inner.cpp @@ -166,13 +166,13 @@ void AppfreezeInner::AppfreezeHandleOverReportCount(bool isSixSecondEvent) " ret:%{public}d", pid, ret); } faultData.errorObject.name = AppFreezeType::THREAD_BLOCK_3S; - EnableFreezeSample(faultData); } if (!IsHandleAppfreeze()) { NotifyANR(faultData); return; } std::string msgContent; + EnableFreezeSample(faultData); GetMainHandlerDump(msgContent); ChangeFaultDateInfo(faultData, msgContent); return; @@ -183,8 +183,7 @@ void AppfreezeInner::EnableFreezeSample(FaultData& newFaultData) std::string eventName = newFaultData.errorObject.name; if (eventName == AppFreezeType::THREAD_BLOCK_3S || eventName == AppFreezeType::LIFECYCLE_HALF_TIMEOUT) { OHOS::HiviewDFX::Watchdog::GetInstance().StartSample(HALF_DURATION, HALF_INTERVAL); - TAG_LOGI(AAFwkTag::APPDFR, "start to sample freeze stack, eventName:%{public}s", - eventName.c_str()); + TAG_LOGI(AAFwkTag::APPDFR, "start to sample freeze stack, eventName:%{public}s", eventName.c_str()); return; } if (eventName == AppFreezeType::THREAD_BLOCK_6S || eventName == AppFreezeType::LIFECYCLE_TIMEOUT || @@ -199,12 +198,8 @@ void AppfreezeInner::EnableFreezeSample(FaultData& newFaultData) } } -int AppfreezeInner::AppfreezeHandle(const FaultData& faultData, bool onlyMainThread) +void AppfreezeInner::ReportAppfreezeTask(const FaultData& faultData, bool onlyMainThread) { - if (!IsHandleAppfreeze()) { - NotifyANR(faultData); - return -1; - } FaultData newFaultData = faultData; EnableFreezeSample(newFaultData); auto reportFreeze = [newFaultData, onlyMainThread]() { @@ -225,6 +220,16 @@ int AppfreezeInner::AppfreezeHandle(const FaultData& faultData, bool onlyMainThr appfreezeInnerTaskHandler_->SubmitTask(reportFreeze, "reportFreeze"); } } +} + +int AppfreezeInner::AppfreezeHandle(const FaultData& faultData, bool onlyMainThread) +{ + if (!IsHandleAppfreeze()) { + NotifyANR(faultData); + return -1; + } + auto watchdogTask = [faultData, onlyMainThread, this] { this->ReportAppfreezeTask(faultData, onlyMainThread); }; + OHOS::HiviewDFX::Watchdog::GetInstance().RunOneShotTask("ReportAppfreezeInnerTask", watchdogTask); return 0; } diff --git a/interfaces/kits/native/appkit/dfr/appfreeze_inner.h b/interfaces/kits/native/appkit/dfr/appfreeze_inner.h index cbe0ae531187c55b2cdfc5a9ad5bb19068d01dca..4c88b9912679a61a67303ef9f2452b8de8be5c24 100644 --- a/interfaces/kits/native/appkit/dfr/appfreeze_inner.h +++ b/interfaces/kits/native/appkit/dfr/appfreeze_inner.h @@ -62,6 +62,7 @@ private: bool GetAppInForeground(); bool GetMainThreadSample(); void EnableFreezeSample(FaultData& newFaultData); + void ReportAppfreezeTask(const FaultData& faultData, bool onlyMainThread); static std::mutex singletonMutex_; static std::shared_ptr instance_; diff --git a/test/unittest/dfr_test/appfreeze_inner_test/appfreeze_inner_test.cpp b/test/unittest/dfr_test/appfreeze_inner_test/appfreeze_inner_test.cpp index 4c778c5f6e30e23d5a9134a7af6663f0229a29f5..e441a40af3b6ac43d59c9e3c0d99cecf18d7f288 100644 --- a/test/unittest/dfr_test/appfreeze_inner_test/appfreeze_inner_test.cpp +++ b/test/unittest/dfr_test/appfreeze_inner_test/appfreeze_inner_test.cpp @@ -156,10 +156,12 @@ HWTEST_F(AppfreezeInnerTest, AppfreezeInner__AppfreezeHandle_001, TestSize.Level appfreezeInner->SetApplicationInfo(applicationInfo); int ret = appfreezeInner->AppfreezeHandle(faultData, onlyMainThread); EXPECT_EQ(ret, 0); + appfreezeInner->ReportAppfreezeTask(faultData, onlyMainThread); ret = appfreezeInner->AcquireStack(faultData, onlyMainThread); EXPECT_EQ(ret, 0); appfreezeInner->SetAppDebug(true); ret = appfreezeInner->AppfreezeHandle(faultData, onlyMainThread); + appfreezeInner->ReportAppfreezeTask(faultData, onlyMainThread); EXPECT_EQ(ret, -1); GTEST_LOG_(INFO) << "AppfreezeInner__AppfreezeHandle_001 end"; }