From fd5cc053f356506347c7c4b7be7b29532812697b Mon Sep 17 00:00:00 2001 From: tendahuang Date: Fri, 11 Mar 2022 14:19:30 +0800 Subject: [PATCH] Matrix iOS Mar 2022 Update --- .../Handler/WCMainThreadHandler.mm | 8 +- .../WCBlockMonitorConfigHandler.h | 5 +- .../WCBlockMonitorConfigHandler.mm | 4 + .../WCBlockMonitorConfiguration.h | 10 +- .../WCBlockMonitorConfiguration.mm | 103 +-------- .../Main/BlockMonitor/WCBlockMonitorMgr.mm | 214 ++++++++---------- .../Monitors/KSCrashMonitor_System.m | 13 +- .../KSCrash/Recording/Tools/KSSymbolicator.c | 4 +- 8 files changed, 114 insertions(+), 247 deletions(-) diff --git a/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/Handler/WCMainThreadHandler.mm b/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/Handler/WCMainThreadHandler.mm index d54bd7452..86349af95 100644 --- a/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/Handler/WCMainThreadHandler.mm +++ b/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/Handler/WCMainThreadHandler.mm @@ -22,8 +22,6 @@ #define STACK_PER_MAX_COUNT 100 // the max address count of one stack -#define SHORTEST_LENGTH_OF_STACK 10 - @interface WCMainThreadHandler () { pthread_mutex_t m_threadLock; int m_cycleArrayCount; @@ -167,8 +165,7 @@ - (KSStackCursor *)getPointStackCursor { BOOL trueStack = NO; for (int i = 0; i < m_cycleArrayCount; i++) { size_t currentValue = m_topStackAddressRepeatArray[i]; - int stackCount = (int)m_mainThreadStackCount[i]; - if (currentValue >= maxValue && stackCount > SHORTEST_LENGTH_OF_STACK) { + if (currentValue >= maxValue) { maxValue = currentValue; trueStack = YES; } @@ -182,8 +179,7 @@ - (KSStackCursor *)getPointStackCursor { size_t currentIndex = (m_tailPoint + m_cycleArrayCount - 1) % m_cycleArrayCount; for (int i = 0; i < m_cycleArrayCount; i++) { int trueIndex = (m_tailPoint + m_cycleArrayCount - i - 1) % m_cycleArrayCount; - int stackCount = (int)m_mainThreadStackCount[trueIndex]; - if (m_topStackAddressRepeatArray[trueIndex] == maxValue && stackCount > SHORTEST_LENGTH_OF_STACK) { + if (m_topStackAddressRepeatArray[trueIndex] == maxValue) { currentIndex = trueIndex; break; } diff --git a/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorConfigHandler.h b/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorConfigHandler.h index fff0dea32..eb12d64c7 100644 --- a/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorConfigHandler.h +++ b/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorConfigHandler.h @@ -34,8 +34,9 @@ - (BOOL)getShouldGetCPUHighLog; - (BOOL)getShouldGetPowerConsumeStack; - (float)getPowerConsumeCPULimit; -- (BOOL)getShouldFilterSameStack; -- (uint32_t)getTriggerFilterCount; +- (BOOL)getShouldFilterSameStack DEPRECATED_MSG_ATTRIBUTE("use dumpDailyLimit instead"); +- (uint32_t)getTriggerFilterCount DEPRECATED_MSG_ATTRIBUTE("use dumpDailyLimit instead"); +- (uint32_t)getDumpDailyLimit; - (BOOL)getShouldPrintMemoryUse; - (BOOL)getShouldGetDiskIOStack DEPRECATED_MSG_ATTRIBUTE("feature removed"); - (size_t)getSingleReadLimit DEPRECATED_MSG_ATTRIBUTE("feature removed"); diff --git a/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorConfigHandler.mm b/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorConfigHandler.mm index c3b64fbaf..b65fd4e81 100644 --- a/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorConfigHandler.mm +++ b/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorConfigHandler.mm @@ -112,6 +112,10 @@ - (uint32_t)getTriggerFilterCount { return m_currentConfiguration.triggerToBeFilteredCount; } +- (uint32_t)getDumpDailyLimit { + return m_currentConfiguration.dumpDailyLimit; +} + - (BOOL)getShouldPrintMemoryUse { return m_currentConfiguration.bPrintMemomryUse; } diff --git a/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorConfiguration.h b/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorConfiguration.h index 50a01c636..a37d8f96e 100644 --- a/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorConfiguration.h +++ b/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorConfiguration.h @@ -32,8 +32,9 @@ const static size_t g_defaultSingleWriteLimit = 100 * 1024; const static size_t g_defaultTotalReadLimit = 500 * 1024 * 1024; const static size_t g_defaultTotalWriteLimit = 200 * 1024 * 1024; const static uint32_t g_defaultMemoryThresholdInMB = 1024; +const static int g_defaultDumpDailyLimit = 100; -@interface WCBlockMonitorConfiguration : NSObject +@interface WCBlockMonitorConfiguration : NSObject + (id)defaultConfig; @@ -77,10 +78,13 @@ const static uint32_t g_defaultMemoryThresholdInMB = 1024; @property (nonatomic, assign) float powerConsumeStackCPULimit; /// enable to filter the same stack in one day, the stack be captured over "triggerToBeFilteredCount" times would be filtered -@property (nonatomic, assign) BOOL bFilterSameStack; +@property (nonatomic, assign) BOOL bFilterSameStack DEPRECATED_MSG_ATTRIBUTE("use dumpDailyLimit instead"); /// define the count that a stack can be captured in one day, see above "bFilterSameStack" -@property (nonatomic, assign) uint32_t triggerToBeFilteredCount; +@property (nonatomic, assign) uint32_t triggerToBeFilteredCount DEPRECATED_MSG_ATTRIBUTE("use dumpDailyLimit instead"); + +/// define the max number of lag dump per day +@property (nonatomic, assign) uint32_t dumpDailyLimit; /// enable printing the memory use @property (nonatomic, assign) BOOL bPrintMemomryUse; diff --git a/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorConfiguration.mm b/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorConfiguration.mm index 913f0b990..39d2b81b7 100644 --- a/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorConfiguration.mm +++ b/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorConfiguration.mm @@ -16,36 +16,6 @@ #import "WCBlockMonitorConfiguration.h" -#define kMonitor "Monitor" -#define kRunloopTimeOut "RunloopTimeOut" -#define kRunloopLowThreshold "RunloopLowThreshold" -#define kRunloopDynamicThresholdEnabled "RunloopDynamicThresholdEnabled" -#define kCheckPeriodTime "CheckPeriodTime" -#define kMainThreadHandle "MainThreadHandle" -#define kMainThreadProfile "MainThreadProfile" -#define kPerStackInterval "PerStackInterval" -#define kMainThreadCount "MainThreadCount" -#define kFrameDropLimit "FrameDropLimit" -#define kGetFPSLog "GetFPSLog" -#define kCPUPercentLimit "CPUPercentLimit" -#define kPrintCPUUsage "PrintCPUUsage" -#define kGetCPUHighLog "GetCPUHigh" -#define kGetPowerConsumeStack "GetPowerConsumeStack" -#define kPowerConsumeCPULimit "PowerConsumeCPULimit" -#define kFilterSameStack "FilterSameStack" -#define kTriggerFilteredCount "TriggerFilteredCount" -#define kPrintMemoryUsage "PrintMemoryUse" -#define kGetDiskIOStack "GetDiskIOStack" -#define kSingleReadLimit "SingleReadLimit" -#define kSingleWriteLimit "SingleWriteLimit" -#define kTotalReadLimit "TotalReadLimit" -#define kTotalWriteLimit "TotalWriteLimit" -#define kPrintCPUFrequency "PrintCPUFrequency" -#define kMemoryWarningThresholdInMB "MemoryWarningThresholdInMB" -#define kSensitiveRunloopHangDetection "SensitiveRunloopHangDetection" -#define kSuspendAllThreads "SuspendAllThreads" -#define kEnableSnapshot "EnableSnapshot" - @implementation WCBlockMonitorConfiguration + (id)defaultConfig { @@ -66,6 +36,7 @@ + (id)defaultConfig { configuration.powerConsumeStackCPULimit = g_defaultPowerConsumeCPULimit; configuration.bFilterSameStack = NO; configuration.triggerToBeFilteredCount = 10; + configuration.dumpDailyLimit = g_defaultDumpDailyLimit; configuration.bPrintMemomryUse = NO; configuration.bPrintCPUFrequency = NO; configuration.bGetDiskIOStack = NO; @@ -81,92 +52,22 @@ + (id)defaultConfig { return configuration; } -- (id)initWithCoder:(NSCoder *)aDecoder { - self = [super init]; - if (self) { - _runloopTimeOut = (useconds_t)[aDecoder decodeInt32ForKey:@kRunloopTimeOut]; - _runloopLowThreshold = (useconds_t)[aDecoder decodeInt32ForKey:@kRunloopLowThreshold]; - _bRunloopDynamicThreshold = [aDecoder decodeBoolForKey:@kRunloopDynamicThresholdEnabled]; - _checkPeriodTime = (useconds_t)[aDecoder decodeInt32ForKey:@kCheckPeriodTime]; - _bMainThreadHandle = [aDecoder decodeBoolForKey:@kMainThreadHandle]; - _perStackInterval = (useconds_t)[aDecoder decodeInt32ForKey:@kPerStackInterval]; - _mainThreadCount = (uint32_t)[aDecoder decodeInt32ForKey:@kMainThreadCount]; - _bMainThreadProfile = [aDecoder decodeBoolForKey:@kMainThreadProfile]; - _limitCPUPercent = [aDecoder decodeFloatForKey:@kCPUPercentLimit]; - _bPrintCPUUsage = [aDecoder decodeBoolForKey:@kPrintCPUUsage]; - _bGetCPUHighLog = [aDecoder decodeBoolForKey:@kGetCPUHighLog]; - _bGetPowerConsumeStack = [aDecoder decodeBoolForKey:@kGetPowerConsumeStack]; - _powerConsumeStackCPULimit = [aDecoder decodeFloatForKey:@kPowerConsumeCPULimit]; - _bFilterSameStack = [aDecoder decodeBoolForKey:@kFilterSameStack]; - _triggerToBeFilteredCount = (uint32_t)[aDecoder decodeInt32ForKey:@kTriggerFilteredCount]; - _bPrintMemomryUse = [aDecoder decodeBoolForKey:@kPrintMemoryUsage]; - _bGetDiskIOStack = [aDecoder decodeBoolForKey:@kGetDiskIOStack]; - _singleReadLimit = [aDecoder decodeInt64ForKey:@kSingleReadLimit]; - _singleWriteLimit = [aDecoder decodeInt64ForKey:@kSingleWriteLimit]; - _totalReadLimit = [aDecoder decodeInt64ForKey:@kTotalReadLimit]; - _totalWriteLimit = [aDecoder decodeInt64ForKey:@kTotalWriteLimit]; - _bPrintCPUFrequency = [aDecoder decodeBoolForKey:@kPrintCPUFrequency]; - _memoryWarningThresholdInMB = (uint32_t)[aDecoder decodeInt32ForKey:@kMemoryWarningThresholdInMB]; - _bSensitiveRunloopHangDetection = [aDecoder decodeBoolForKey:@kSensitiveRunloopHangDetection]; - _bSuspendAllThreads = [aDecoder decodeBoolForKey:@kSuspendAllThreads]; - _bEnableSnapshot = [aDecoder decodeBoolForKey:@kEnableSnapshot]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)aCoder { - [aCoder encodeInt32:_runloopTimeOut forKey:@kRunloopTimeOut]; - [aCoder encodeInt32:_runloopLowThreshold forKey:@kRunloopLowThreshold]; - [aCoder encodeBool:_bRunloopDynamicThreshold forKey:@kRunloopDynamicThresholdEnabled]; - [aCoder encodeInt32:_checkPeriodTime forKey:@kCheckPeriodTime]; - [aCoder encodeBool:_bMainThreadHandle forKey:@kMainThreadHandle]; - [aCoder encodeInt32:_perStackInterval forKey:@kPerStackInterval]; - [aCoder encodeInt32:_mainThreadCount forKey:@kMainThreadCount]; - [aCoder encodeBool:_bMainThreadProfile forKey:@kMainThreadProfile]; - [aCoder encodeFloat:_limitCPUPercent forKey:@kCPUPercentLimit]; - [aCoder encodeBool:_bPrintCPUUsage forKey:@kPrintCPUUsage]; - [aCoder encodeBool:_bGetCPUHighLog forKey:@kGetCPUHighLog]; - [aCoder encodeBool:_bGetPowerConsumeStack forKey:@kGetPowerConsumeStack]; - [aCoder encodeFloat:_powerConsumeStackCPULimit forKey:@kPowerConsumeCPULimit]; - [aCoder encodeBool:_bFilterSameStack forKey:@kFilterSameStack]; - [aCoder encodeInt32:_triggerToBeFilteredCount forKey:@kTriggerFilteredCount]; - [aCoder encodeBool:_bPrintMemomryUse forKey:@kPrintMemoryUsage]; - [aCoder encodeBool:_bGetDiskIOStack forKey:@kGetDiskIOStack]; - [aCoder encodeInt64:_singleReadLimit forKey:@kSingleReadLimit]; - [aCoder encodeInt64:_singleWriteLimit forKey:@kSingleWriteLimit]; - [aCoder encodeInt64:_totalReadLimit forKey:@kTotalReadLimit]; - [aCoder encodeInt64:_totalWriteLimit forKey:@kTotalWriteLimit]; - [aCoder encodeBool:_bPrintCPUFrequency forKey:@kPrintCPUFrequency]; - [aCoder encodeInt32:_memoryWarningThresholdInMB forKey:@kMemoryWarningThresholdInMB]; - [aCoder encodeBool:_bSensitiveRunloopHangDetection forKey:@kSensitiveRunloopHangDetection]; - [aCoder encodeBool:_bSuspendAllThreads forKey:@kSuspendAllThreads]; - [aCoder encodeBool:_bEnableSnapshot forKey:@kEnableSnapshot]; -} - - (NSString *)description { NSDictionary *properties = @{ @"runloopTimeOut": @(self.runloopTimeOut), @"runloopLowThreshold": @(self.runloopLowThreshold), @"bRunloopDynamicThreshold": @(self.bRunloopDynamicThreshold), - @"checkPeriodTime": @(self.checkPeriodTime), @"bMainThreadHandle": @(self.bMainThreadHandle), @"perStackInterval": @(self.perStackInterval), - @"mainThreadCount": @(self.mainThreadCount), @"bMainThreadProfile": @(self.bMainThreadProfile), @"limitCPUPercent": @(self.limitCPUPercent), @"bPrintCPUUsage": @(self.bPrintCPUUsage), @"bGetCPUHighLog": @(self.bGetCPUHighLog), @"bGetPowerConsumeStack": @(self.bGetPowerConsumeStack), @"powerConsumeStackCPULimit": @(self.powerConsumeStackCPULimit), - @"bFilterSameStack": @(self.bFilterSameStack), - @"triggerToBeFilteredCount": @(self.triggerToBeFilteredCount), + @"dumpDailyLimit": @(self.dumpDailyLimit), @"bPrintMemomryUse": @(self.bPrintMemomryUse), @"bPrintCPUFrequency": @(self.bPrintCPUFrequency), - @"bGetDiskIOStack": @(self.bGetDiskIOStack), - @"singleReadLimit": @(self.singleReadLimit), - @"singleWriteLimit": @(self.singleWriteLimit), - @"totalReadLimit": @(self.totalReadLimit), - @"totalWriteLimit": @(self.totalWriteLimit), @"memoryWarningThresholdInMB": @(self.memoryWarningThresholdInMB), @"bSensitiveRunloopHangDetection": @(self.bSensitiveRunloopHangDetection), @"bSuspendAllThreads": @(self.bSuspendAllThreads), diff --git a/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorMgr.mm b/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorMgr.mm index cc68b39fa..e60422b2e 100644 --- a/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorMgr.mm +++ b/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/CrashBlockPlugin/Main/BlockMonitor/WCBlockMonitorMgr.mm @@ -126,19 +126,16 @@ __asm volatile( static KSStackCursor **g_PointCPUHighThreadArray = NULL; static int g_PointCpuHighThreadCount = 0; static float *g_PointCpuHighThreadValueArray = NULL; - -static BOOL g_filterSameStack = NO; -static uint32_t g_triggerdFilterSameCnt = 0; static BOOL g_runloopThresholdUpdated = NO; API_AVAILABLE(ios(11.0)) static NSProcessInfoThermalState g_thermalState = NSProcessInfoThermalStateNominal; -#define APP_SHOULD_SUSPEND (180 * BM_MicroFormat_Second) - #define PRINT_MEMORY_USE_INTERVAL (5 * BM_MicroFormat_Second) #define PRINT_CPU_FREQUENCY_INTERVAL (10 * BM_MicroFormat_Second) +#define DETECTION_THREAD_JUDGE_SUSPEND_THRESHOLD (10 * BM_MicroFormat_Second) + #define __timercmp(tvp, uvp, cmp) (((tvp)->tv_sec == (uvp)->tv_sec) ? ((tvp)->tv_usec cmp(uvp)->tv_usec) : ((tvp)->tv_sec cmp(uvp)->tv_sec)) #define BM_SAFE_CALL_SELECTOR_NO_RETURN(obj, sel, func) \ @@ -155,7 +152,6 @@ __asm volatile( static struct timeval g_tvRun; static BOOL g_bRun; -static struct timeval g_enterBackground; static struct timeval g_tvSuspend; static CFRunLoopActivity g_runLoopActivity; static struct timeval g_lastCheckTime; @@ -164,8 +160,6 @@ __asm volatile( #if !TARGET_OS_OSX static BOOL g_bBackgroundLaunch = NO; #endif -static BOOL g_bMonitor = NO; -static BOOL g_bInSuspend = NO; typedef enum : NSUInteger { eRunloopInitMode, @@ -247,6 +241,8 @@ @interface WCBlockMonitorMgr () { BOOL m_suspendAllThreads; BOOL m_enableSnapshot; + + struct timeval m_recordStackTime; } @property (nonatomic, strong) WCBlockMonitorConfigHandler *monitorConfigHandler; @@ -336,8 +332,6 @@ - (void)start { return; } - g_bMonitor = YES; - g_MainThreadHandle = [_monitorConfigHandler getMainThreadHandle]; g_MainThreadProfile = [_monitorConfigHandler getMainThreadProfile]; [self setRunloopThreshold:[_monitorConfigHandler getRunloopTimeOut] isFirstTime:YES]; @@ -349,7 +343,6 @@ - (void)start { m_blockDiffTime = 0; m_firstSleepTime = 5; gettimeofday(&g_tvSuspend, NULL); - g_enterBackground = { 0, 0 }; gettimeofday(&g_lastCheckTime, NULL); if ([_monitorConfigHandler getShouldPrintMemoryUse]) { @@ -381,18 +374,12 @@ - (void)start { } else { m_powerConsumeStackCollector = nil; } - g_filterSameStack = [_monitorConfigHandler getShouldFilterSameStack]; - g_triggerdFilterSameCnt = [_monitorConfigHandler getTriggerFilterCount]; g_bSensitiveRunloopHangDetection = [_monitorConfigHandler getSensitiveRunloopHangDetection]; m_suspendAllThreads = [_monitorConfigHandler getShouldSuspendAllThreads]; m_enableSnapshot = [_monitorConfigHandler getShouldEnableSnapshot]; - if ([_monitorConfigHandler getShouldGetDiskIOStack]) { - // delete the IO Disk Stack Collector - } - #if !TARGET_OS_OSX [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willTerminate) name:UIApplicationWillTerminateNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self @@ -447,14 +434,11 @@ - (void)stop { #if !TARGET_OS_OSX - (void)handleBackgroundLaunch { - g_bMonitor = NO; g_bBackgroundLaunch = YES; } - (void)handleSuspend { - g_bMonitor = NO; gettimeofday(&g_tvSuspend, NULL); - g_bInSuspend = YES; } #endif @@ -478,25 +462,21 @@ - (void)willTerminate { - (void)didBecomeActive { MatrixInfo(@"did become active"); - g_enterBackground = { 0, 0 }; - - g_bInSuspend = NO; m_currentState = [UIApplication sharedApplication].applicationState; - g_bMonitor = YES; - g_bLaunchOver = YES; - - if (g_bBackgroundLaunch) { + if (g_bBackgroundLaunch && !g_bLaunchOver) { + MatrixInfo(@"backgroundLaunch before launchOver, clean dump"); [self clearDumpInBackgroundLaunch]; g_bBackgroundLaunch = NO; } + + g_bLaunchOver = YES; [self clearLaunchLagRecord]; } - (void)didEnterBackground { MatrixInfo(@"did enter background"); - gettimeofday(&g_enterBackground, NULL); m_currentState = [UIApplication sharedApplication].applicationState; } @@ -563,86 +543,83 @@ - (void)threadProc { m_firstSleepTime = 0; } - if (g_filterSameStack) { - m_stackHandler = [[WCFilterStackHandler alloc] init]; - } + m_stackHandler = [[WCFilterStackHandler alloc] init]; set_curr_thread_ignore_logging(true); while (YES) { @autoreleasepool { - if (g_bMonitor) { - EDumpType dumpType = [self check]; - if (m_bStop) { - break; - } - BM_SAFE_CALL_SELECTOR_NO_RETURN(_delegate, - @selector(onBlockMonitor:enterNextCheckWithDumpType:), - onBlockMonitor:self enterNextCheckWithDumpType:dumpType); - if (dumpType != EDumpType_Unlag) { - if (EDumpType_BackgroundMainThreadBlock == dumpType || EDumpType_MainThreadBlock == dumpType) { - EFilterType filterType = [self needFilter]; - if (filterType == EFilterType_None) { - if (g_MainThreadHandle) { - if (g_PointMainThreadArray != NULL) { - free(g_PointMainThreadArray); - g_PointMainThreadArray = NULL; - } - if (g_MainThreadProfile) { - g_PointMainThreadProfile = [m_pointMainThreadHandler getStackProfile]; - } - g_PointMainThreadArray = [m_pointMainThreadHandler getPointStackCursor]; - g_PointMainThreadRepeatCountArray = [m_pointMainThreadHandler getPointStackRepeatCount]; - m_potenHandledLagFile = [self dumpFileWithType:dumpType]; - BM_SAFE_CALL_SELECTOR_NO_RETURN(_delegate, - @selector(onBlockMonitor:getDumpFile:withDumpType:), - onBlockMonitor:self getDumpFile:m_potenHandledLagFile withDumpType:dumpType); - if (g_PointMainThreadArray != NULL) { - KSStackCursor_Backtrace_Context *context = (KSStackCursor_Backtrace_Context *)g_PointMainThreadArray->context; - if (context->backtrace) { - free((uintptr_t *)context->backtrace); - } - free(g_PointMainThreadArray); - g_PointMainThreadArray = NULL; - } - if (g_PointMainThreadProfile != NULL) { - free(g_PointMainThreadProfile); - g_PointMainThreadProfile = NULL; + + EDumpType dumpType = [self check]; + if (m_bStop) { + break; + } + BM_SAFE_CALL_SELECTOR_NO_RETURN(_delegate, + @selector(onBlockMonitor:enterNextCheckWithDumpType:), + onBlockMonitor:self enterNextCheckWithDumpType:dumpType); + if (dumpType != EDumpType_Unlag) { + if (EDumpType_BackgroundMainThreadBlock == dumpType || EDumpType_MainThreadBlock == dumpType) { + EFilterType filterType = [self needFilter]; + if (filterType == EFilterType_None) { + if (g_MainThreadHandle) { + if (g_PointMainThreadArray != NULL) { + free(g_PointMainThreadArray); + g_PointMainThreadArray = NULL; + } + if (g_MainThreadProfile) { + g_PointMainThreadProfile = [m_pointMainThreadHandler getStackProfile]; + } + g_PointMainThreadArray = [m_pointMainThreadHandler getPointStackCursor]; + g_PointMainThreadRepeatCountArray = [m_pointMainThreadHandler getPointStackRepeatCount]; + m_potenHandledLagFile = [self dumpFileWithType:dumpType]; + BM_SAFE_CALL_SELECTOR_NO_RETURN(_delegate, + @selector(onBlockMonitor:getDumpFile:withDumpType:), + onBlockMonitor:self getDumpFile:m_potenHandledLagFile withDumpType:dumpType); + if (g_PointMainThreadArray != NULL) { + KSStackCursor_Backtrace_Context *context = (KSStackCursor_Backtrace_Context *)g_PointMainThreadArray->context; + if (context->backtrace) { + free((uintptr_t *)context->backtrace); } - } else { - m_potenHandledLagFile = [self dumpFileWithType:dumpType]; - BM_SAFE_CALL_SELECTOR_NO_RETURN(_delegate, - @selector(onBlockMonitor:getDumpFile:withDumpType:), - onBlockMonitor:self getDumpFile:m_potenHandledLagFile withDumpType:dumpType); + free(g_PointMainThreadArray); + g_PointMainThreadArray = NULL; + } + if (g_PointMainThreadProfile != NULL) { + free(g_PointMainThreadProfile); + g_PointMainThreadProfile = NULL; } } else { + m_potenHandledLagFile = [self dumpFileWithType:dumpType]; BM_SAFE_CALL_SELECTOR_NO_RETURN(_delegate, - @selector(onBlockMonitor:dumpType:filter:), - onBlockMonitor:self dumpType:dumpType filter:filterType); + @selector(onBlockMonitor:getDumpFile:withDumpType:), + onBlockMonitor:self getDumpFile:m_potenHandledLagFile withDumpType:dumpType); } - + } else { BM_SAFE_CALL_SELECTOR_NO_RETURN(_delegate, - @selector(onBlockMonitorMainThreadBlock:), - onBlockMonitorMainThreadBlock:self); - } else if (EDumpType_CPUBlock == dumpType) { - //1. get cpu high stack cursor - if (m_powerConsumeStackCollector) { - if (g_PointCPUHighThreadArray != NULL) { - [self freeCpuHighThreadArray]; - } - g_PointCPUHighThreadArray = [m_powerConsumeStackCollector getCPUStackCursor]; - g_PointCpuHighThreadCount = [m_powerConsumeStackCollector getCurrentCpuHighStackNumber]; - g_PointCpuHighThreadValueArray = [m_powerConsumeStackCollector getCpuHighThreadValueArray]; + @selector(onBlockMonitor:dumpType:filter:), + onBlockMonitor:self dumpType:dumpType filter:filterType); + } + + BM_SAFE_CALL_SELECTOR_NO_RETURN(_delegate, + @selector(onBlockMonitorMainThreadBlock:), + onBlockMonitorMainThreadBlock:self); + } else if (EDumpType_CPUBlock == dumpType) { + //1. get cpu high stack cursor + if (m_powerConsumeStackCollector) { + if (g_PointCPUHighThreadArray != NULL) { + [self freeCpuHighThreadArray]; } - //2. dump file with type - m_potenHandledLagFile = [self dumpFileWithType:dumpType]; - [self freeCpuHighThreadArray]; - } else { - m_potenHandledLagFile = [self dumpFileWithType:dumpType]; + g_PointCPUHighThreadArray = [m_powerConsumeStackCollector getCPUStackCursor]; + g_PointCpuHighThreadCount = [m_powerConsumeStackCollector getCurrentCpuHighStackNumber]; + g_PointCpuHighThreadValueArray = [m_powerConsumeStackCollector getCpuHighThreadValueArray]; } + //2. dump file with type + m_potenHandledLagFile = [self dumpFileWithType:dumpType]; + [self freeCpuHighThreadArray]; } else { - [self resetStatus]; + m_potenHandledLagFile = [self dumpFileWithType:dumpType]; } + } else { + [self resetStatus]; } [self recordCurrentStack]; @@ -671,7 +648,8 @@ - (void)recordCurrentStack { */ unsigned long nTotalCnt = m_nIntervalTime / g_CheckPeriodTime; for (int nCnt = 0; nCnt < nTotalCnt && !m_bStop; nCnt++) { - if (g_MainThreadHandle && g_bMonitor) { + gettimeofday(&m_recordStackTime, NULL); + if (g_MainThreadHandle) { int intervalCount = g_CheckPeriodTime / g_PerStackInterval; // 1s 每秒检查20次 if (intervalCount <= 0) { usleep(g_CheckPeriodTime); @@ -700,6 +678,16 @@ - (void)recordCurrentStack { } else { usleep(g_CheckPeriodTime); } + + struct timeval tvCur; + gettimeofday(&tvCur, NULL); + unsigned long long diff = [WCBlockMonitorMgr diffTime:&m_recordStackTime endTime:&tvCur]; + if (diff > DETECTION_THREAD_JUDGE_SUSPEND_THRESHOLD) { + //running after suspend + gettimeofday(&g_tvRun, NULL); + MatrixInfo(@"running after suspend, diff %llu", diff); + return; + } } } @@ -743,20 +731,12 @@ - (EDumpType)check { g_runLoopActivity, diff); - if (g_bBackgroundLaunch) { - MatrixInfo(@"background launch, filter"); + if (g_bBackgroundLaunch && !g_bLaunchOver) { + MatrixInfo(@"backgroundLaunch before launchOver, filter"); return EDumpType_Unlag; } if (m_currentState == UIApplicationStateBackground) { - if (g_enterBackground.tv_sec != 0 || g_enterBackground.tv_usec != 0) { - unsigned long long enterBackgroundTime = [WCBlockMonitorMgr diffTime:&g_enterBackground endTime:&tvCur]; - if (__timercmp(&g_enterBackground, &tvCur, <) && (enterBackgroundTime > APP_SHOULD_SUSPEND)) { - MatrixInfo(@"may mistake block %lld", enterBackgroundTime); - return EDumpType_Unlag; - } - } - return EDumpType_BackgroundMainThreadBlock; } #endif @@ -865,7 +845,6 @@ - (EFilterType)needFilter { BOOL bIsSame = NO; static std::vector vecCallStack(300); __block NSUInteger nSum = 0; - __block NSUInteger stackFeat = 0; // use the top stack address; if (g_MainThreadHandle) { nSum = [m_pointMainThreadHandler getLastMainThreadStackCount]; @@ -874,7 +853,6 @@ - (EFilterType)needFilter { for (size_t i = 0; i < nSum; i++) { vecCallStack[i] = stack[i]; } - stackFeat = kssymbolicate_symboladdress(stack[0]); } else { nSum = 0; } @@ -883,9 +861,6 @@ - (EFilterType)needFilter { if (nSum < WXGBackTraceMaxEntries) { vecCallStack[nSum] = pc; } - if (nSum == 0) { - stackFeat = kssymbolicate_symboladdress(pc); - } nSum++; }]; } @@ -925,13 +900,12 @@ - (EFilterType)needFilter { m_lastMainThreadStackCount++; } - if (g_filterSameStack) { - NSUInteger repeatCnt = [m_stackHandler addStackFeat:stackFeat]; - if (repeatCnt > g_triggerdFilterSameCnt) { - MatrixInfo(@"call stack appear too much today, repeat count:[%u]", (uint32_t)repeatCnt); - return EFilterType_TrigerByTooMuch; - } + NSUInteger reportCount = [m_stackHandler addStackFeat:0]; // 传入0当作简单计数器 + if (reportCount > [_monitorConfigHandler getDumpDailyLimit]) { + MatrixInfo(@"exceeds report limit today, count:[%lu]", reportCount); + return EFilterType_TrigerByTooMuch; } + MatrixInfo(@"call stack diff"); return EFilterType_None; } @@ -1015,21 +989,21 @@ void myRunLoopBeginCallback(CFRunLoopObserverRef observer, CFRunLoopActivity act break; case kCFRunLoopBeforeTimers: - if (g_bRun == NO && g_bInSuspend == NO) { + if (g_bRun == NO) { gettimeofday(&g_tvRun, NULL); } g_bRun = YES; break; case kCFRunLoopBeforeSources: - if (g_bRun == NO && g_bInSuspend == NO) { + if (g_bRun == NO) { gettimeofday(&g_tvRun, NULL); } g_bRun = YES; break; case kCFRunLoopAfterWaiting: - if (g_bRun == NO && g_bInSuspend == NO) { + if (g_bRun == NO) { gettimeofday(&g_tvRun, NULL); } g_bRun = YES; @@ -1051,9 +1025,7 @@ void myRunLoopEndCallback(CFRunLoopObserverRef observer, CFRunLoopActivity activ if (g_bSensitiveRunloopHangDetection && g_bRun) { [WCBlockMonitorMgr checkRunloopDuration]; } - if (g_bInSuspend == NO) { - gettimeofday(&g_tvRun, NULL); - } + gettimeofday(&g_tvRun, NULL); g_bRun = NO; break; diff --git a/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/KSCrash/Recording/Monitors/KSCrashMonitor_System.m b/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/KSCrash/Recording/Monitors/KSCrashMonitor_System.m index 143dfab0f..23230c976 100644 --- a/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/KSCrash/Recording/Monitors/KSCrashMonitor_System.m +++ b/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/KSCrash/Recording/Monitors/KSCrashMonitor_System.m @@ -335,18 +335,7 @@ static bool isSimulatorBuild() { * @return The stringified hex representation of the hash for this device + app. */ static const char *getDeviceAndAppHash() { - NSMutableData *data = nil; - -#if KSCRASH_HAS_UIDEVICE - if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) { - data = [NSMutableData dataWithLength:16]; - [[UIDevice currentDevice].identifierForVendor getUUIDBytes:data.mutableBytes]; - } else -#endif - { - data = [NSMutableData dataWithLength:6]; - kssysctl_getMacAddress("en0", [data mutableBytes]); - } + NSMutableData *data = [[NSMutableData alloc] init]; // Append some device-specific data. [data appendData:(NSData * _Nonnull)[nsstringSysctl(@"hw.machine") dataUsingEncoding:NSUTF8StringEncoding]]; diff --git a/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/KSCrash/Recording/Tools/KSSymbolicator.c b/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/KSCrash/Recording/Tools/KSSymbolicator.c index 22f2e4f77..35d3aa2d8 100644 --- a/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/KSCrash/Recording/Tools/KSSymbolicator.c +++ b/matrix/matrix-iOS/Matrix/WCCrashBlockMonitor/KSCrash/Recording/Tools/KSSymbolicator.c @@ -26,7 +26,7 @@ bool kssymbolicator_symbolicate(KSStackCursor *cursor) { Dl_info symbolsBuffer; - if (ksdl_dladdr(CALL_INSTRUCTION_FROM_RETURN_ADDRESS(cursor->stackEntry.address), &symbolsBuffer)) { + if (ksdl_dladdr_use_cache(CALL_INSTRUCTION_FROM_RETURN_ADDRESS(cursor->stackEntry.address), &symbolsBuffer)) { cursor->stackEntry.imageAddress = (uintptr_t)symbolsBuffer.dli_fbase; cursor->stackEntry.imageName = symbolsBuffer.dli_fname; cursor->stackEntry.symbolAddress = (uintptr_t)symbolsBuffer.dli_saddr; @@ -43,7 +43,7 @@ bool kssymbolicator_symbolicate(KSStackCursor *cursor) { uintptr_t kssymbolicate_symboladdress(uintptr_t stackAddress) { Dl_info symbolsBuffer; - if (ksdl_dladdr(CALL_INSTRUCTION_FROM_RETURN_ADDRESS(stackAddress), &symbolsBuffer)) { + if (ksdl_dladdr_use_cache(CALL_INSTRUCTION_FROM_RETURN_ADDRESS(stackAddress), &symbolsBuffer)) { return (uintptr_t)symbolsBuffer.dli_saddr; } return 0;