From 1796b3ca46fb9101541e9baa34a0620ccf944ec1 Mon Sep 17 00:00:00 2001 From: "linghe.lh" Date: Mon, 20 May 2019 11:21:11 +0800 Subject: [PATCH] [iOS] fix crash when instanceid is nil --- .../Sources/Monitor/WXExceptionUtils.m | 82 ++++++++++--------- .../bridge/platform/core_side_in_platform.cpp | 3 +- 2 files changed, 44 insertions(+), 41 deletions(-) diff --git a/ios/sdk/WeexSDK/Sources/Monitor/WXExceptionUtils.m b/ios/sdk/WeexSDK/Sources/Monitor/WXExceptionUtils.m index ea793760f3..c913d3305f 100644 --- a/ios/sdk/WeexSDK/Sources/Monitor/WXExceptionUtils.m +++ b/ios/sdk/WeexSDK/Sources/Monitor/WXExceptionUtils.m @@ -43,56 +43,58 @@ + (void)commitCriticalExceptionRT:(NSString *)instanceId errCode:(NSString *)err NSMutableDictionary* extInfo = [[NSMutableDictionary alloc] initWithDictionary:extParams]; WXPerformBlockOnComponentThread(^{ + NSString *bundleUrlCommit = @"BundleUrlDefault"; + NSString *instanceIdCommit = @"InstanceIdDefalut"; + WXSDKInstance *instance = nil; + if(![WXUtility isBlankString:instanceId]){ + instanceIdCommit = instanceId; + instance = [WXSDKManager instanceForID:instanceId]; + } + NSString *targetException = exception.length > 200 ? [exception substringWithRange:NSMakeRange(0, 200)] : exception; - NSMutableSet *exceptionSet = [recordExceptionHistory objectForKey:instanceId]; + NSMutableSet *exceptionSet = [recordExceptionHistory objectForKey:instanceIdCommit]; if (!exceptionSet) { exceptionSet = [[NSMutableSet alloc] init]; - [recordExceptionHistory setObject:exceptionSet forKey:instanceId]; + [recordExceptionHistory setObject:exceptionSet forKey:instanceIdCommit]; } else if ([exceptionSet containsObject:targetException]) { return; } [exceptionSet addObject:targetException]; - NSString *bundleUrlCommit = @"BundleUrlDefault"; - NSString *instanceIdCommit = @"InstanceIdDefalut"; - WXSDKInstance * instance ; - if(![WXUtility isBlankString:instanceId]){ - instanceIdCommit = instanceId; - instance = [WXSDKManager instanceForID:instanceId]; - if(instance){ - bundleUrlCommit = instance.pageName?:instance.scriptURL.absoluteString; - if(nil == bundleUrlCommit || [@"" isEqualToString:bundleUrlCommit]){ - bundleUrlCommit = @"instanceUnSetPageNameOrUrl"; - } - - if (instance.containerInfo && instance.containerInfo.count >0) { - [extInfo addEntriesFromDictionary:instance.containerInfo]; - } - if (nil != instance.viewController) { - [extInfo setObject:NSStringFromClass(instance.viewController.class)?:@"unKnowVCName" forKey:KEY_PAGE_PROPERTIES_CONTAINER_NAME]; - } - [extInfo setObject:[self _convertInstanceStageToStr:instance] forKey:@"wxStageList"]; - [extInfo setObject:instance.pageName?:@"unKnowPageNameCaseUnSet" forKey:@"wxBundlePageName"]; - NSString* bundleTemplateCommit = @"has recycle"; - if (nil != instance.bundleTemplate) { - NSUInteger strLength = instance.bundleTemplate.length; - bundleTemplateCommit = [instance.bundleTemplate substringWithRange:NSMakeRange(0, strLength>300?300:strLength)]; - } - [extInfo setObject:bundleTemplateCommit forKey:@"wxTemplateOfBundle"]; - [extInfo setObject:[instance.apmInstance templateInfo] forKey:@"templateInfo"]; - NSNumber* pageStartTime = [instance.apmInstance.stageDic objectForKey:KEY_PAGE_STAGES_DOWN_BUNDLE_START]; - if (nil == pageStartTime) { - pageStartTime = [instance.apmInstance.stageDic objectForKey:KEY_PAGE_STAGES_RENDER_ORGIGIN]; - } - if (nil != pageStartTime) { - long useTime = [WXUtility getUnixFixTimeMillis] - pageStartTime.longValue; - [extInfo setObject:@(useTime) forKey:@"wxUseTime"]; - } - - }else if([instanceIdCommit hasPrefix:@"WX_KEY_EXCEPTION"]){ - bundleUrlCommit = instanceId; + if(instance){ + bundleUrlCommit = instance.pageName?:instance.scriptURL.absoluteString; + if(nil == bundleUrlCommit || [@"" isEqualToString:bundleUrlCommit]){ + bundleUrlCommit = @"instanceUnSetPageNameOrUrl"; + } + + if (instance.containerInfo && instance.containerInfo.count >0) { + [extInfo addEntriesFromDictionary:instance.containerInfo]; + } + if (nil != instance.viewController) { + [extInfo setObject:NSStringFromClass(instance.viewController.class)?:@"unKnowVCName" forKey:KEY_PAGE_PROPERTIES_CONTAINER_NAME]; } + [extInfo setObject:[self _convertInstanceStageToStr:instance] forKey:@"wxStageList"]; + [extInfo setObject:instance.pageName?:@"unKnowPageNameCaseUnSet" forKey:@"wxBundlePageName"]; + NSString* bundleTemplateCommit = @"has recycle"; + if (nil != instance.bundleTemplate) { + NSUInteger strLength = instance.bundleTemplate.length; + bundleTemplateCommit = [instance.bundleTemplate substringWithRange:NSMakeRange(0, strLength>300?300:strLength)]; + } + [extInfo setObject:bundleTemplateCommit forKey:@"wxTemplateOfBundle"]; + [extInfo setObject:[instance.apmInstance templateInfo] forKey:@"templateInfo"]; + NSNumber* pageStartTime = [instance.apmInstance.stageDic objectForKey:KEY_PAGE_STAGES_DOWN_BUNDLE_START]; + if (nil == pageStartTime) { + pageStartTime = [instance.apmInstance.stageDic objectForKey:KEY_PAGE_STAGES_RENDER_ORGIGIN]; + } + if (nil != pageStartTime) { + long useTime = [WXUtility getUnixFixTimeMillis] - pageStartTime.longValue; + [extInfo setObject:@(useTime) forKey:@"wxUseTime"]; + } + + }else if([instanceIdCommit hasPrefix:@"WX_KEY_EXCEPTION"]){ + bundleUrlCommit = instanceId; } + WXJSExceptionInfo * jsExceptionInfo = [[WXJSExceptionInfo alloc] initWithInstanceId:instanceIdCommit bundleUrl:bundleUrlCommit errorCode:errCode functionName:function exception:exception userInfo: [extInfo mutableCopy]]; // //record top5 erromsg ,if errorType is not WX_RENDER_ERROR diff --git a/weex_core/Source/core/bridge/platform/core_side_in_platform.cpp b/weex_core/Source/core/bridge/platform/core_side_in_platform.cpp index b7e1064f4a..8452603dbf 100644 --- a/weex_core/Source/core/bridge/platform/core_side_in_platform.cpp +++ b/weex_core/Source/core/bridge/platform/core_side_in_platform.cpp @@ -18,8 +18,9 @@ */ -#include #include "core/bridge/platform/core_side_in_platform.h" + +#include "core/common/view_utils.h" #include "base/string_util.h" #include "base/log_defines.h" #include "core/config/core_environment.h"