cpapm

所属分类:Web服务器
开发工具:Objective-C
文件大小:0KB
下载次数:0
上传日期:2019-12-01 14:57:47
上 传 者sh-1993
说明:  读,
(Read,)

文件列表:
cpapm.xcodeproj/ (0, 2019-12-01)
cpapm.xcodeproj/project.pbxproj (36155, 2019-12-01)
cpapm.xcodeproj/project.xcworkspace/ (0, 2019-12-01)
cpapm.xcodeproj/project.xcworkspace/contents.xcworkspacedata (192, 2019-12-01)
cpapm.xcodeproj/project.xcworkspace/xcshareddata/ (0, 2019-12-01)
cpapm.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (238, 2019-12-01)
cpapm.xcodeproj/project.xcworkspace/xcuserdata/ (0, 2019-12-01)
cpapm.xcodeproj/project.xcworkspace/xcuserdata/yangyouyong.xcuserdatad/ (0, 2019-12-01)
cpapm.xcodeproj/project.xcworkspace/xcuserdata/yangyouyong.xcuserdatad/UserInterfaceState.xcuserstate (61428, 2019-12-01)
cpapm.xcodeproj/xcuserdata/ (0, 2019-12-01)
cpapm.xcodeproj/xcuserdata/yangyouyong.xcuserdatad/ (0, 2019-12-01)
cpapm.xcodeproj/xcuserdata/yangyouyong.xcuserdatad/xcdebugger/ (0, 2019-12-01)
cpapm.xcodeproj/xcuserdata/yangyouyong.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist (4822, 2019-12-01)
cpapm.xcodeproj/xcuserdata/yangyouyong.xcuserdatad/xcschemes/ (0, 2019-12-01)
cpapm.xcodeproj/xcuserdata/yangyouyong.xcuserdatad/xcschemes/WellTangAPM.xcscheme (4195, 2019-12-01)
cpapm.xcodeproj/xcuserdata/yangyouyong.xcuserdatad/xcschemes/cpapm.xcscheme (4195, 2019-12-01)
cpapm.xcodeproj/xcuserdata/yangyouyong.xcuserdatad/xcschemes/xcschememanagement.plist (758, 2019-12-01)
cpapm/ (0, 2019-12-01)
cpapm/APM/ (0, 2019-12-01)
cpapm/APM/ANT/ (0, 2019-12-01)
cpapm/APM/ANT/ANT.h (568, 2019-12-01)
cpapm/APM/ANT/ANT.m (985, 2019-12-01)
cpapm/APM/ANT/ANTPingThread.h (371, 2019-12-01)
cpapm/APM/ANT/ANTPingThread.m (1367, 2019-12-01)
cpapm/APM/CrashANT/ (0, 2019-12-01)
cpapm/APM/CrashANT/CrashCatcher.h (579, 2019-12-01)
cpapm/APM/CrashANT/CrashCatcher.m (7194, 2019-12-01)
cpapm/APM/CrashANT/NSObject+MethodSwizzleList.h (288, 2019-12-01)
cpapm/APM/CrashANT/NSObject+MethodSwizzleList.m (566, 2019-12-01)
cpapm/APM/CrashANT/OriginalObjectMethod+Swizzle.h (232, 2019-12-01)
cpapm/APM/CrashANT/OriginalObjectMethod+Swizzle.m (1030, 2019-12-01)
cpapm/APM/CrashANT/OriginalObjectMethod.h (315, 2019-12-01)
cpapm/APM/CrashANT/OriginalObjectMethod.m (2529, 2019-12-01)
cpapm/APM/CrashANT/fishhook.c (8497, 2019-12-01)
cpapm/APM/CrashANT/fishhook.h (3059, 2019-12-01)
cpapm/APM/CrashANT/method_check.c (160, 2019-12-01)
cpapm/APM/CrashANT/method_check.h (5431, 2019-12-01)
cpapm/APM/Dependency/ (0, 2019-12-01)
cpapm/APM/Dependency/Backtrace/ (0, 2019-12-01)
... ...

## iOS监控 1. [卡顿监控](https://github.com/YangYouYong/cpapm/blob/master/#Blocked) 1. [内存泄露监控](https://github.com/YangYouYong/cpapm/blob/master/#Leaks) 1. [网络监控](https://github.com/YangYouYong/cpapm/blob/master/#Network) * [基于CFNetwork的监控](https://github.com/YangYouYong/cpapm/blob/master/#fishhook) 1. [crash监控](https://github.com/YangYouYong/cpapm/blob/master/#Crash) 1. [方法调换监控](https://github.com/YangYouYong/cpapm/blob/master/#HookCheck) ### 卡顿监控 > 通过分析栈调用情况自顶向下查找卡顿的方法调用 ``` 2018-01-11 14:29:12.493901+0800 cpapm[16525:25693273] ----mainTrace---- 2018-01-11 14:29:12.494088+0800 cpapm[16525:25693273] Backtrace of Thread 771: libsystem_platform.dylib 0x114e71f49 _platform_memmove$VARIANT$Haswell + 41 CoreFoundation 0x110f2b3d0 _CFStringCheckAndGetCharacters + 240 CoreFoundation 0x110f2b282 -[__NSCFString getCharacters:range:] + 34 Foundation 0x11007fd38 _NSNewStringByAppendingStrings + 1071 Foundation 0x1100a2b2f -[NSString stringByAppendingString:] + 185 cpapm 0x10fd734b0 -[TraceViewController blockFoo] + 128 cpapm 0x10fd733f1 -[TraceViewController ANTTask:] + 257 UIKit 0x111488972 -[UIApplication sendAction:to:from:forEvent:] + 83 UIKit 0x111607c3c -[UIControl sendAction:to:forEvent:] + 67 UIKit 0x111607f59 -[UIControl _sendActionsForEvents:withEvent:] + 450 UIKit 0x111606e86 -[UIControl touchesEnded:withEvent:] + 618 UIKit 0x1114fe807 -[UIWindow _sendTouchesForEvent:] + 2807 ``` ### 内存泄露监控 > 查看内存泄露的日志, 定位到具体的类. 可加入FBRetainCycle 找到具体引用关系 ``` 2018-01-11 14:32:33.153020+0800 cpapm[16525:25692073] *** is still alive *** 2018-01-11 14:32:33.153255+0800 cpapm[16525:25692073] Detect Possible Controller Leak: LeaksViewController ``` ### 网络监控 > 通过设置代理 拿到每次网络请求的入参及返回值 做一些事情(如网络本地缓存, 网络调试等, 网络性能监控等) ``` // catch any network based on NSURLProtocol -(void)netAntDidCatchRequest:(NSURLRequest *)request response:(NSURLResponse *)response data:(NSData *)data { id obj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; if (obj == nil) { obj = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; } NSLog(@"catch_request:%@\nresponse:%@,\ndata:%@",request.URL.absoluteString, response.URL.absoluteString, obj); } ``` #### 基于CFNetwork的监控 > 拦截CFNetwork 下的网络请求. 校验DNS拦截, 请求信息, 网络性能, 响应时间等信息. > > 暂时未做响应body的拦截 ``` void hooked_proxyCallBack(CFReadStreamRef stream,CFStreamEventType type,void *clientCallBackInfo){ NSDictionary *proxyInfo = CFBridgingRelease(CFReadStreamCopyProperty(stream, kCFStreamPropertyHTTPProxy)); NSString *requestId = proxyInfo[CFRequest_KEY]; NSMutableDictionary *proxyCallBackMap = [CFNetProxy sharedInstance].requestMap; CFReadStreamClientCallBack original_callback = NULL; if (clientCallBackInfo != NULL) { CFNetProxyModel *proxy = proxyCallBackMap[requestId]; if (proxy) { original_callback = [proxy.callbackPointer pointerValue]; }else{ NSLog(@"missed_data"); } } CFReadStreamRef readStream = stream; if(type == kCFStreamEventHasBytesAvailable){ CFNetProxyModel *proxy = proxyCallBackMap[requestId]; if (proxy) { // proxy receive data /** UInt8 buff[255]; long length = CFReadStreamRead(stream, buff, 255); NSMutableData *mutiData = proxy.bufferData; if(!mutiData){ mutiData = [[NSMutableData alloc] init]; } [mutiData appendBytes:buff length:length]; proxy.bufferData = mutiData; */ } }else if(type == kCFStreamEventEndEncountered){ // end data CFNetProxyModel *proxy = proxyCallBackMap[requestId]; if (proxy) { proxy.responseData = proxy.bufferData; } NSLog(@"proxy complete"); } if (original_callback != NULL) { original_callback(readStream, type, clientCallBackInfo); } } ``` ### crash监控 > 通过拦截NSExecption对象 和拦截single 对象捕获crash 做crash 上报等事情. ``` / you can report logs here or store them -(void)logLocalException:(NSException *)exception { NSArray *stackArray = [CrashCatcher backtrace]; NSString *reason = [exception reason]; NSString *name = [exception name]; NSString *exceptionInfo = [NSString stringWithFormat:@"Exception reason:%@\nException name:%@\nException stack:%@\nUserInfo:%@\n",name, reason, stackArray,exception.userInfo]; NSString *logFilePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true).firstObject stringByAppendingPathComponent:@"debug_exception_log.txt"]; NSFileManager *manager = [NSFileManager defaultManager]; if(![manager fileExistsAtPath:logFilePath]){ [manager createFileAtPath:logFilePath contents:[exceptionInfo dataUsingEncoding:NSUTF8StringEncoding] attributes:nil]; }else{ NSData *data = [NSData dataWithContentsOfFile:logFilePath]; NSString *contents = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; contents = [contents stringByAppendingString:exceptionInfo]; [contents writeToFile:logFilePath atomically:true encoding:NSUTF8StringEncoding error:nil]; } } ``` ### 方法调换监控 > 通过C方法查找到当前类哪些方法被hook掉或者被category重写了. 用于hook系统方法前的检测 ``` 2018-01-11 14:40:35.325799+0800 cpapm[16525:25692073] swizzledInfo:( { originalName = Small; swizzledMethodName = "-[OriginalObjectMethod(Swizzle) swizzle_Small]"; }, { originalName = Foo; swizzledMethodName = "-[OriginalObjectMethod(Swizzle) swizzle_Foo]"; }, { originalName = write; swizzledMethodName = "-[OriginalObjectMethod(Swizzle) write]"; }, { originalName = "swizzle_Small"; swizzledMethodName = "-[OriginalObjectMethod Small]"; }, { originalName = "swizzle_Foo"; swizzledMethodName = "-[OriginalObjectMethod Foo]"; } ) ``` TODO: > fishhook 监控基于CFNetwork的网络请求 > CPU爆表 & 内存爆表监控 > PLeakSniffer 再造 > FileManager > ...

近期下载者

相关文件


收藏者