- 浏览: 585769 次
- 性别:
- 来自: 广州
-
文章分类
最新评论
-
JYY282:
[i][/i]
Ecshop与Shopex的比较 -
qq247890212:
我也遇见这问题了,真诡异。重新下载个猫换了就好了。 太浪费时间 ...
诡异:ClassNotFoundException: org.springframework.web.filter.CharacterEncoding
From: http://blog.csdn.net/cococoolwhj/article/details/7459064
http://www.yifeiyang.net/iphone-development-skills-of-debugging-articles-3-crash-after-debugging-skills-program/
当我们的程序突然死掉了,Xcode突然送出一段 "message sent to deallocated instance" 的错误,我们该怎样定位我们的程序bug呢?
又或者我们已经通过AdHoc发布了我们的β版程序,更甚至于我们的程序已经发布到了app store上;而当我们的程序突然在测试人员,或者是最终用户那里突然当掉,是否能收集到这样的日志信息,供我们解析bug呢?
模拟器上显示堆栈信息
当我们在模拟器上调试时,可能经常遇到下面的内存访问错误:
1 |
2011-01-17 20:21:11.41 App[26067:207] *** -[Testedit retain]: message sent to deallocated instance 0x12e4b0 |
首先,我们为了定位问题,需要Xcode帮我们显示栈信息,可以通过Scode中执行文件的属性来设置。如下图所示,选中 MallocStackLogging 选项。该选项只能在模拟器上有效,并且如果你改变了iOS的版本后也需要再次设定该选项。
这之后,你就可以在终端输入 info malloc-history 命令,如下所示;
1 |
(gdb) info malloc-history 0x12e4b0 |
之后得到如下的堆栈信息,从此分析具体的问题所在。
除此之外,也可以使用下面的命令;
1 |
(gdb) shell malloc_history {pid/partial-process-name} {address} |
例如下图所示;
另外,内存使用时“EXC_BAD_ACCESS”的错误信息也是经常遇到的,这时我们只要将上面执行文件属性中的 NSZombieEnabled 选上,也能定位该问题。
最后,这些设置信息都是可以在运行期确认的,如下;
1 |
NSLog(@"NSZombieEnabled: %s", getenv("NSZombieEnabled")); |
在iPhone上输出日志
如果不是在模拟器上,又或者我们的设备没有连接到PC上,那么如何调试我们的程序呢?假如我们通过AdHoc发布了程序,希望随时得到测试人员的反馈,可以利用下面的方法,将标准出力(stderr)信息记录到文件中,然后通过邮件新式发给开发者。
1. 设置一个开关,用来清空日志文件内容,并切换输出位置;
1 2 3 4 5 6 7 8 |
- (BOOL)deleteLogFile { [self finishLog]; BOOL success = [[NSFileManager defaultManager] removeItemAtPath:[self loggingPath] error:nil]; [self startLog]; return success; } |
当我们调用上面的deleteLogFile后,就会清空之前的日志,并设置新的输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
- (void)finishLog { fflush(stderr); dup2(dup(STDERR_FILENO), STDERR_FILENO); close(dup(STDERR_FILENO)); } - (NSString*)loggingPath { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"]; return logPath; } - (void)startLog { freopen([[self loggingPath] cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr); } |
2. 当日志取得之后,可以通过下面的方式发送邮件给开发者
1 2 3 4 5 6 7 8 9 10 11 |
- (void)sendLogByMail { MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; picker.mailComposeDelegate = self; [picker setSubject:[NSString stringWithFormat:@"%@ - Log", [self appName]]]; NSString *message = [NSString stringWithContentsOfFile:[self loggingPath] encoding:NSUTF8StringEncoding error:nil]; [picker setMessageBody:message isHTML:NO]; [self.navigationController presentModalViewController:picker animated:YES]; [picker release]; } |
iPhone应用程序的CrashReporter机能
苹果在固件2.0发布的时候,其中一项特性是向iPhone开发者通过邮件发送错误报告,以便开发人员更好的了解自己的软件运行状况。不过不少开发者报告此服务有时无法获取到~/Library/Logs/CrashReporter/MobileDevice directory的错误信息。
现在苹果提供了一种更简单的方法,使iPhone开发者可以通过iTunes更容易的查看崩溃报告。具体方法使进入iTunesConnect(在进入之前确定你有iPhone开发者帐号),点击管理你应用程序,之后就可以看到用户崩溃日志了。
这里我介绍一下从设备中取出CrashLog,并解析的方法。
CrashLog的位置
程序Crash之后,将设备与PC中的iTunes连接,设备中的CrashLog文件也将一并同步到PC中。其中位置如下;
1 2 3 4 5 6 7 8 |
Mac: ~/Library/Logs/CrashReporter/MobileDevice Windows Vista/7: C:\Users\<user_name>\AppData\Roaming\Apple computer\Logs\CrashReporter/MobileDevice Windows XP: C:\Documents and Settings\<user_name>\Application Data\Apple computer\Logs\CrashReporter |
在这些目录下,会有具体设备的目录,其下就是许多*.crash的文件。
比如程序TestEditor在iPhone1设备上的crashLog如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
~Library/Logs/CrashReporter/MobileDevice/iPhone1/TestEditor_2010-09-23-454678_iPhone1.crash
Incident Identifier: CAF9ED40-2D59-45EA-96B0-52BDA1115E9F
CrashReporter Key: 30af939d26f6ecc5f0d08653b2aaf47933ad8b8e
Process: TestEditor [12506]
Path: /var/mobile/Applications/60ACEDBC-600E-42AF-9252-42E32188A044/TestEditor.app/TestEditor
Identifier: TestEditor
Version: ??? (???)
Code Type: ARM (Native)
Parent Process: launchd [1]
Date/Time: 2010-09-23 11:25:56.357 +0900
OS Version: iPhone OS 3.1.3 (7E18)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000059
Crashed Thread: 0
Thread 0 Crashed:
0 UIKit 0x332b98d8 0x331b2000 + 1079512
1 UIKit 0x3321d1a8 0x331b2000 + 438696
2 UIKit 0x3321d028 0x331b2000 + 438312
3 UIKit 0x332b9628 0x331b2000 + 1078824
4 UIKit 0x33209d70 0x331b2000 + 359792
5 UIKit 0x33209c08 0x331b2000 + 359432
6 QuartzCore 0x324cc05c 0x324ae000 + 122972
7 QuartzCore 0x324cbe64 0x324ae000 + 122468
8 CoreFoundation 0x3244f4bc 0x323f8000 + 357564
9 CoreFoundation 0x3244ec18 0x323f8000 + 355352
10 GraphicsServices 0x342e91c0 0x342e5000 + 16832
11 UIKit 0x331b5c28 0x331b2000 + 15400
12 UIKit 0x331b4228 0x331b2000 + 8744
13 TestEditor 0x00002c3a 0x1000 + 7226
14 TestEditor 0x00002c04 0x1000 + 7172
... (以下略)
|
虽然我们看到了出为题时的堆栈信息,但是因为没有符号信息,仍然不知道到底哪里出问题了...
.dSYM文件
编译调试相关的符号信息都被包含在编译时的 xxxx.app.dSYM 文件当中,所以我们在发布程序前将它们保存起来,调试Crash问题的时候会很有用。
首先,我们来找到该文件。
用Xcode编译的程序,在其编译目录下都会生成 [程序名].app.dSMY 文件,比如 Xcode 4 的编译目录缺省的是
1 2 3 4 5 |
~Library/Developer/Xcode/DerivedData # 在改目录下搜寻编译后的.dSMY文件 $ cd ~/Library/Developer/Xcode/DerivedData $ find . -name '*.dSYM' |
另外,我们也可以通过 Xcode的Preferences... -> Locations -> Locations 的Derived Data来确认该目录的位置。
1 |
~/Library/Developer/Xcode/DerivedData/TestEditor-aahmlrjpobenlsdvhjppcfqhogru/ArchiveIntermediates/TestEditor/BuildProductsPath/Release-iphoneos/TestEditor.app.dSYM |
※ 大家每次像App Store发布自己程序的时候都记着保存该文件哦,要不然出现Crash的时候,就无从下手了。
解决符号问题
接下来,我们再来介绍一下使用.dSYM文件来恢复程序符号的方法。
首先,使用一个Xcode提供的叫做 symbolicatecrash 的小工具,它可以实现我们在CrashLog中添加符号信息的机能。该文件位于下面的位置,为方便起见,可以把它拷贝到系统默认路径下。
Xcode4.3.1的位置好像在这 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash
1 2 3 |
/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash $ sudo cp /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash /usr/local/bin |
1 2 3 |
$ symbolicatecrash [CrashLog file] [dSYM file] $ symbolicatecrash TestEditor_2010-09-23-454678_iPhone1.crash TestEditor.app.dSYM |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Thread 0 Crashed: 0 UIKit 0x332b98d8 -[UIWindowController transitionViewDidComplete:fromView:toView:] + 668 1 UIKit 0x3321d1a8 -[UITransitionView notifyDidCompleteTransition:] + 160 2 UIKit 0x3321d028 -[UITransitionView _didCompleteTransition:] + 704 3 UIKit 0x332b9628 -[UITransitionView _transitionDidStop:finished:] + 44 4 UIKit 0x33209d70 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 284 5 UIKit 0x33209c08 -[UIViewAnimationState animationDidStop:finished:] + 60 6 QuartzCore 0x324cc05c _ZL23run_animation_callbacksdPv + 440 7 QuartzCore 0x324cbe64 _ZN2CAL14timer_callbackEP16__CFRunLoopTimerPv + 156 8 CoreFoundation 0x3244f4bc CFRunLoopRunSpecific + 2192 9 CoreFoundation 0x3244ec18 CFRunLoopRunInMode + 44 10 GraphicsServices 0x342e91c0 GSEventRunModal + 188 11 UIKit 0x331b5c28 -[UIApplication _run] + 552 12 UIKit 0x331b4228 UIApplicationMain + 960 13 TestEditor 0x00002c3a main (main.m:14) 14 TestEditor 0x00002c04 0x1000 + 7172 |
由此,我们可以具体定位程序中出问题的地方。
用StackTrace取得崩溃时的日志
异常处理机制
任何语言都有异常的处理机制,Objective-C也不例外。与C++/Java类似的语法,它也提供@try, @catch, @throw, @finally关键字。使用方法如下。
1 2 3 4 5 6 7 8 9 10 11 12 |
@try { ... } @catch (CustomException *ce) { ... } @catch (NSException *ne) { // Perform processing necessary at this level. ... } @catch (id ue) { ... } @finally { // Perform processing necessary whether an exception occurred or not. ... } |
同时对于系统Crash而引起的程序异常退出,可以通过UncaughtExceptionHandler机制捕获;也就是说在程序中catch以外的内容,被系统自带的错误处理而捕获。我们要做的就是用自定义的函数替代该ExceptionHandler即可。
- NSGetUncaughtExceptionHandler() 得到现在系统自带处理Handler;得到它后,如果程序正常退出时用来回复系统原先设置
- NSSetUncaughtExceptionHandler() 红色设置自定义的函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
void MyUncaughtExceptionHandler(NSException *exception) { printf("uncaught %s\n", [[exception name] cString]); // ~ // 显示当前堆栈内容 NSArray *callStackArray = [exception callStackReturnAddresses]; int frameCount = [callStackArray count]; void *backtraceFrames[frameCount]; for (int i=0; i<frameCount; i++) { backtraceFrames[i] = (void *)[[callStackArray objectAtIndex:i] unsignedIntegerValue]; } } int main() { // ~ NSUncaughtExceptionHandler *ueh = NSGetUncaughtExceptionHandler(); NSSetUncaughtExceptionHandler(&MyUncaughtExceptionHandler); // ~ } - (void)exit_processing:(NSNotification *)notification { NSSetUncaughtExceptionHandler(ueh); } - (void)viewDidLoad { // 这里重载程序正常退出时UIApplicationWillTerminateNotification接口 UIApplication *app = [UIApplication sharedApplication]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exit_processing:) name:UIApplicationWillTerminateNotification object:app] } |
处理signal
使用Objective-C的异常处理是不能得到signal的,如果要处理它,我们还要利用unix标准的signal机制,注册SIGABRT, SIGBUS, SIGSEGV等信号发生时的处理函数。该函数中我们可以输出栈信息,版本信息等其他一切我们所想要的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#include <signal.h> void stacktrace(int sig, siginfo_t *info, void *context) { [mstr appendString:@"Stack:\n"]; void* callstack[128]; int i, frames = backtrace(callstack, 128); char** strs = backtrace_symbols(callstack, frames); for (i = 0; i <; frames; ++i) { [mstr appendFormat:@"%s\n", strs[i]]; } } int main(int argc, char *argv[]) { struct sigaction mySigAction; mySigAction.sa_sigaction = stacktrace; mySigAction.sa_flags = SA_SIGINFO; sigemptyset(&mySigAction.sa_mask); sigaction(SIGQUIT, &mySigAction, NULL); sigaction(SIGILL , &mySigAction, NULL); sigaction(SIGTRAP, &mySigAction, NULL); sigaction(SIGABRT, &mySigAction, NULL); sigaction(SIGEMT , &mySigAction, NULL); sigaction(SIGFPE , &mySigAction, NULL); sigaction(SIGBUS , &mySigAction, NULL); sigaction(SIGSEGV, &mySigAction, NULL); sigaction(SIGSYS , &mySigAction, NULL); sigaction(SIGPIPE, &mySigAction, NULL); sigaction(SIGALRM, &mySigAction, NULL); sigaction(SIGXCPU, &mySigAction, NULL); sigaction(SIGXFSZ, &mySigAction, NULL); NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return (retVal); } |
总结
- 用NSGetUncaughtExceptionHandler()取得当前系统异常处理Handler
- 用NSSetUncaughtExceptionHandler()注册自定义异常处理Handler
- 注册signal处理机制
- 注册Handler中打印堆栈,版本号等信息
- 必要的时候将其保存到dump.txt文件
- 异常程序退出
- 如果程序不是异常退出,则还原之前系统的异常处理函数句柄
- 如果下次程序启动,发现有dump.txt的异常文件,启动邮件发送报告机制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
#include <signal.h> void stacktrace(int sig, siginfo_t *info, void *context) { [mstr appendString:@"Stack:\n"]; void* callstack[128]; int i, frames = backtrace(callstack, 128); char** strs = backtrace_symbols(callstack, frames); for (i = 0; i <; frames; ++i) { [mstr appendFormat:@"%s\n", strs[i]]; } } void MyUncaughtExceptionHandler(NSException *exception) { printf("uncaught %s\n", [[exception name] cString]); // ~ // 显示当前堆栈内容 NSArray *callStackArray = [exception callStackReturnAddresses]; int frameCount = [callStackArray count]; void *backtraceFrames[frameCount]; for (int i=0; i<frameCount; i++) { backtraceFrames[i] = (void *)[[callStackArray objectAtIndex:i] unsignedIntegerValue]; } } int main(int argc, char *argv[]) { struct sigaction mySigAction; mySigAction.sa_sigaction = stacktrace; mySigAction.sa_flags = SA_SIGINFO; sigemptyset(&mySigAction.sa_mask); sigaction(SIGQUIT, &mySigAction, NULL); sigaction(SIGILL , &mySigAction, NULL); sigaction(SIGTRAP, &mySigAction, NULL); sigaction(SIGABRT, &mySigAction, NULL); sigaction(SIGEMT , &mySigAction, NULL); sigaction(SIGFPE , &mySigAction, NULL); sigaction(SIGBUS , &mySigAction, NULL); sigaction(SIGSEGV, &mySigAction, NULL); sigaction(SIGSYS , &mySigAction, NULL); sigaction(SIGPIPE, &mySigAction, NULL); sigaction(SIGALRM, &mySigAction, NULL); sigaction(SIGXCPU, &mySigAction, NULL); sigaction(SIGXFSZ, &mySigAction, NULL); // ~ NSUncaughtExceptionHandler *ueh = NSGetUncaughtExceptionHandler(); NSSetUncaughtExceptionHandler(&MyUncaughtExceptionHandler); // ~ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return (retVal); } - (void)exit_processing:(NSNotification *)notification { NSSetUncaughtExceptionHandler(ueh); } - (void)viewDidLoad { // 这里重载程序正常退出时UIApplicationWillTerminateNotification接口 UIApplication *app = [UIApplication sharedApplication]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exit_processing:) name:UIApplicationWillTerminateNotification object:app] } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Signal:10 Stack: 0 TestEditor 0x0006989d dump + 64 1 TestEditor 0x00069b4b signalHandler + 46 2 libSystem.B.dylib 0x31dcd60b _sigtramp + 26 3 TestEditor 0x000252b9 -[PopClientcreateUnreadMessageWithUIDL:maxMessageCount:] + 76 4 TestEditor 0x00025b85 -[PopClientgetUnreadIdList:] + 348 5 TestEditor 0x000454dd -[Connection receiveMessages:] + 688 6 TestEditor 0x00042db1 -[Connection main] + 188 7 Foundation 0x305023f9 __NSThread__main__ + 858 8 libSystem.B.dylib 0x31d6a5a8 _pthread_body + 28 AppVer:TestEditor 1.2.0 System:iPhone OS OS Ver:3.0 Model:iPhoneDate:09/06/08 21:25:59JST |
其中从_sigtramp函数下面开始进入我们的程序,即地址0x000252b9开始。其所对应的具体文件名和行号我们能知道吗?
利用之前介绍的dSYM文件和gdb,我们可以得到这些信息。
1 2 3 4 5 6 7 |
cd $PROJ_PATH$/build/Release-iphoneos/TestEditor.app.dSYM/ cd Contents/Resources/DWARF gdb TestEditor gdb>info line *0x000252b9 Line 333 of "~/IbisMail/Classes/Models/PopClient.m"; starts at address 0x2a386 <-[PopClient retrieve:]+86> and ends at 0x2a390 <-[PopClient retrieve:]+96> |
发表评论
-
Objective-C 与 C++ 的异同
2013-04-02 12:03 1479http://www.cnblogs.com/y041039 ... -
Cocos2D-X是全球知名的开源跨平台手机游戏引擎
2013-01-22 10:05 2771http://www.oschina.net/p/cocos ... -
iOS Keyboard 键盘高度变化 自适应
2013-01-15 15:43 3330[[NSNotificationCenter default ... -
iOS使用自定义字体
2012-11-27 12:11 12173From: http://blog.csdn.net/csy1 ... -
4 款类似 Facebook/Path 切换效果的 iOS 组件
2012-11-27 12:03 2216From: http://blog.csdn.net/lia ... -
Path 2.0的UI界面设计详细介绍
2012-11-27 11:56 1487如Path的创始人Dave Morin ... -
史上最全的App Store邮箱列表
2012-11-27 11:51 1285From: http://roybaby.blog.51cto ... -
iOS从info.plist 获取项目的名称及版本号
2012-11-16 10:54 1696From: http://blog.sina.com.cn/s ... -
MapKit annotation drag and drop with callout info update
2012-10-13 10:38 2431http://hollowout.blogspot ... -
NSArray 或NSDictionary 调用writeToFile方法失败原因
2012-08-31 10:03 4517NSArray 或NSDictionary 调用writeTo ... -
如何让IOS应用从容地崩溃
2012-08-30 15:25 1634From: http://www.cocoachina.com ... -
iOS中判断设备系统版本
2012-08-29 17:17 31728在iOS开发中,经常要考虑系统的向下兼容,如果使用 ... -
iOS 汉字转拼音
2012-08-21 16:42 1484From: http://www.cnblogs.com/v2 ... -
iOS模拟器截图工具
2012-08-17 16:35 1687From: http://magicalboy.com/ios ... -
XCode下的iOS单元测试
2012-08-10 17:47 1186From: http://mobile.51cto.com/ ... -
AFNetworking
2012-08-08 10:54 4663AFNetworking on github: https:/ ... -
Wrapping Conventions
2012-08-01 15:54 868Wrapping Conventions ... -
Core Animation如何使显式动画结束时的值直接作用Layer
2012-08-01 14:51 3806(1)使用隐式动画会直接改变layer的属性值,如: ima ... -
How To Debug Memory Leaks with XCode and Instruments Tutoria
2012-07-31 16:30 1071From: http://www.raywenderlich. ... -
Using Properties in Objective-C Tutorial
2012-07-31 16:27 949From: http://www.raywenderlich. ...
相关推荐
在iOS开发过程中,"iOS crash log"是开发者和运维人员非常关注的内容,因为它们提供了应用程序崩溃时的关键信息,有助于定位并解决错误。当一个iOS应用出现“崩溃”现象,即程序无法正常运行并突然退出时,系统会...
dwarfdump是一个小工具,用来解析crashLog。它可以检查app的UUID,如果app有两个UUID,表明它是一个fat binary。fat binary是一个可以在多种架构上运行的二进制文件。dwarfdump也可以检查dSYM文件是否是上面的UUID。...
iOS Crash文件分析方法汇总 iOS Crash文件分析是移动应用程序开发中非常重要的一步骤,它可以帮助开发者快速定位和解决应用程序崩溃问题。今天,我们将总结iOS Crash文件的几种分析方法,这些方法都是平时比较常用...
在iOS开发过程中,Crash是开发者经常会遇到的问题,它可能会发生在任何时间,导致用户体验下降,甚至丢失重要数据。本文将详细介绍几种通用的iOS Crash解决方法,帮助开发者们更有效地定位和修复这类问题。 1. **...
1. 收集crash log:可以从用户设备、iTunes同步或云服务中获取。 2. 获取.dSYM文件:通常在应用的构建输出目录或通过App Store Connect下载。 3. 符号化:使用SymbolicateCrash或其他工具,结合.crash文件和.dSYM...
当我们遇到“Crash log on target platform”的问题时,这意味着在特定的目标平台上(如Android、iOS或某个特定的操作系统)遇到了应用程序崩溃的情况。为了深入理解并解决这个问题,我们需要详细地查看和解析错误...
1. 收集崩溃日志:从用户的设备上获取崩溃日志,通常可以通过用户的反馈、iTunes Connect或者设备的控制台获取。 2. 导入日志:将收集到的崩溃日志导入到工具中。 3. 加载符号文件:如果`SYM_master.zip`包含正确的....
首先,当iOS应用发生崩溃时,系统会自动生成一个名为`crash.log`或`.ips`的崩溃日志文件。这些文件包含了崩溃发生时的堆栈跟踪信息,这对于定位问题非常有用。为了解析这些文件,我们需要使用Xcode或第三方工具如...
当应用在设备中运行发生崩溃,iOS将记录这些错误日志并且创建了崩溃报告(Crash Report)。崩溃报告中包含了iOS的版本、日期、异常类型、堆栈跟踪以及其他信息。 ① 在Xcode中查看崩溃报告 当应用还在开发过程中发生...
5. **获取设备信息**:崩溃日志中通常包含设备类型、操作系统版本、内存使用情况等信息,这对于分析问题是否与特定设备或系统版本有关很有帮助。 6. **用户反馈集成**:除了系统生成的崩溃日志,还可以通过集成第三...
《iOS应用崩溃分析工具——crash-for-ios》 在iOS应用开发过程中,处理应用程序崩溃是一项至关重要的任务。为了能够高效地定位和修复问题,开发者通常需要解析崩溃日志(crash log)。"crash-for-ios"就是这样一个...
"ios-打印log和奔溃日志.zip"这个压缩包提供了一种方法来收集和分析应用的运行情况,以辅助开发者定位并修复问题。以下是关于iOS应用中日志打印、奔溃日志分析以及相关知识点的详细说明: 1. **日志打印**: - **...
文档中还提到了一些特别的Crash Log符号化工具和方法,比如使用dwarfdump工具来获取UUID(统一唯一识别码),然后根据这个UUID来匹配.app和.dSYM文件,以完成符号化。 百度地图团队分享的Crash修复经验包含了一系列...
在iOS应用开发中,Crash是一个非常重要的问题,因为它直接影响到用户体验和应用的稳定性。本文将详细介绍iOS Crash的常规跟踪方法以及如何集成Bugly进行更高效的问题定位。 首先,我们来了解一下iOS Crash的常规...
一个iOS调试工具,监控所有HTTP请求,自动捕获Crash分析。 1.当出现功能异常时,有很大可能是与服务器的接口交互有数据异常,不管是客户端参数传错还是服务器返回结果错误,都不需要连接电脑调试了,只要打开...
当用户报告应用崩溃时,系统会生成一个包含崩溃时刻内存状态的Crash Log。这个日志包含了堆栈跟踪信息,但是是以内存地址的形式显示,而不是源代码行。有了dSYM文件,开发者可以使用Xcode或者其他第三方工具如Fabric...
可以看到 Log,Crash,Network,ANR,Leak,CPU,RAM,FPS,NetFlow,Folder 等等等等,炒鸡方便。.zip,使用基于swift的一行代码自动显示日志、崩溃、网络、anr、泄漏、cpu、ram、fps、netflow、文件夹等。就像上帝睁开眼睛
10. **调试技巧**:在调试时,可以通过设置条件日志、使用Log.dumpsys等方法获取更详细的系统信息,或结合ANR(应用无响应)和crash报告来排查问题。 理解并熟练运用这些知识点,开发者能够有效地利用手机屏幕打印...
硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备、移动设备等 操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式...
《iOS监控编程》一书由iOS大神撰写,深入探讨了如何在iOS平台上进行有效的监控与调试,旨在帮助开发者更好地理解和解决实际开发中的问题。下面,我们将根据书名和描述,结合相关标签,详细探讨iOS监控编程的知识点。...