advanced ios debbuging (reloaded)

95
Advanced iOS Debugging Massimo Oliviero

Upload: massimo-oliviero

Post on 10-May-2015

2.230 views

Category:

Technology


1 download

DESCRIPTION

The debug process constitutes an important part in an app's development cycle. Knowing the (right) tools and techniques means you can optimizes time and therefore costs. In this session we will see a number of techniques to optimize debugging of iOS applications exploiting the power of Xcode, LLDB and other support tools.

TRANSCRIPT

Page 1: Advanced iOS Debbuging (Reloaded)

Advanced iOS DebuggingMassimo Oliviero

Page 2: Advanced iOS Debbuging (Reloaded)

Massimo Oliviero

Freelance Software Developer

web http://www.massimooliviero.netemail [email protected] http://www.slideshare.net/MassimoOlivierotwitter @maxoly

Page 3: Advanced iOS Debbuging (Reloaded)

Agenda

‣ Code, some tips for standard functions

‣ Xcode, the best tools for debugging

‣ LLDB, your great friend

‣ Tools, network debugging how to and more

‣ Remote, over the air debugging

‣ Resources, links and videos

Page 4: Advanced iOS Debbuging (Reloaded)

Source code

KimeraA simple iOS application for educational purpose

https://github.com/maxoly/Kimera

Page 5: Advanced iOS Debbuging (Reloaded)

Code

Page 6: Advanced iOS Debbuging (Reloaded)

It all began...

NSLog(@"Error :( %@", error);

NSLog(@"User: %@", user);

NSLog(@"Array: %@", array);NSLog(@"URL: %@", url);

NSLog(@"Count: %i", count);NSLog(@"User %@", user);

NSLog(@"Array %@", array);

NSLog(@"Error :( %@", error);

NSLog(@"Error :( %@", error);

NSLog(@"URL: %@", url);

NSLog(@"Array: %@", array);

NSLog(@"User: %@", user);

NSLog(@"User: %@", user);NSLog(@"User: %@", user);

NSLog(@"User: %@", user);

NSLog(@"User: %@", user);

NSLog(@"User: %@", user);

NSLog(@"User: %@", user);

Page 7: Advanced iOS Debbuging (Reloaded)

NSLog

‣ It prints debugs output only to the console

‣ It’s a simple native Foundation function

‣ It’s not too bad, but It’s an ancient technique

‣ It slows things down considerably (if not handled)

Page 8: Advanced iOS Debbuging (Reloaded)

NSLog optimization

‣ Use convenient macro

‣ Use string conversion functions

‣ Try alternative frameworks

Page 9: Advanced iOS Debbuging (Reloaded)

#if defined DEBUG#define MYNSLog(s, ...) NSLog((@"%s [Line %d] " s), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)#else #define MYNSLog(s, ...)#endif

-[TestViewController viewDidLoad] [Line 33] message

- (void)viewDidLoad{ [super viewDidLoad]; MYNSLog(@"message");}

MyGreatApp-prefix.pch

TestViewController.m

Console

NSLog macro

Page 10: Advanced iOS Debbuging (Reloaded)

NSLog macro

‣ Enables DEBUG mode output only

‣ Outputs function name and line number

‣ Place macro into .pch !le or in a header !le

‣ You can use other macros like __ FILE__ (for example)

Page 11: Advanced iOS Debbuging (Reloaded)

CGPoint point = CGPointMake(10.5f, 12.3f);NSLog(@"point: %@", NSStringFromCGPoint(point));

AdvanceDebuggingExample[3050:c07] point: {10.5, 12.3}

AdvanceDebuggingExample.m

Console

String conversion functions

Page 12: Advanced iOS Debbuging (Reloaded)

String conversion functions

‣ NSStringFromCGAffineTransform

‣ NSStringFromCGPoint

‣ NSStringFromCGRect

‣ NSStringFromCGSize

‣ NSStringFromUIEdgeInsets

‣ NSStringFromUIOffset

Page 13: Advanced iOS Debbuging (Reloaded)

Try alternative framworks

‣ CocoaLumberjack https://github.com/robbiehanson/CocoaLumberjack

‣ NSLoggerhttps://github.com/fpillet/NSLogger

‣ DMLoggerhttps://github.com/malcommac/DMLogger

Page 14: Advanced iOS Debbuging (Reloaded)

Demo

Page 15: Advanced iOS Debbuging (Reloaded)

Xcode

Page 16: Advanced iOS Debbuging (Reloaded)

Xcode

‣ Con!gure your Behaviors

‣ Print more information with Arguments

‣ Push the limit with Build Settings

‣ Go beyond logging with Breakpoints

Page 17: Advanced iOS Debbuging (Reloaded)

Behaviors

Page 18: Advanced iOS Debbuging (Reloaded)

Xcode default

Debugger bar

Page 19: Advanced iOS Debbuging (Reloaded)

Xcode default Behaviors

Variables View Console

Debugger Navigator

Page 20: Advanced iOS Debbuging (Reloaded)

Xcode Behaviors

‣ Match Xcode to your Work$ow

‣ Use Behaviors to control Xcode

‣ Behaviors lets you specify what should happen when a variety of events occur (like Run)

Page 21: Advanced iOS Debbuging (Reloaded)

Behaviors

When pauses

Show Debug NavigatorShow debugger views

Page 22: Advanced iOS Debbuging (Reloaded)

Change default Behavior

For example, when Running pauses:

‣ show the Breakpoint Navigator instead of Debug Navigator

‣ show only Variable Views

‣ open another tab only with Console view

Page 23: Advanced iOS Debbuging (Reloaded)

Demo

Page 24: Advanced iOS Debbuging (Reloaded)

Arguments

Page 25: Advanced iOS Debbuging (Reloaded)

Arguments

Product > Scheme > Edit Scheme > Arguments

Page 26: Advanced iOS Debbuging (Reloaded)

Core Data Logging

-com.apple.CoreData.SQLDebug 1

Page 27: Advanced iOS Debbuging (Reloaded)

Core Data and iCloud logging

-com.apple.coredata.ubiquity.logLevel 3

Page 28: Advanced iOS Debbuging (Reloaded)

Build Settings

Page 29: Advanced iOS Debbuging (Reloaded)

Enable Static Analyzer

Page 30: Advanced iOS Debbuging (Reloaded)

Treat Warning as Error

Page 31: Advanced iOS Debbuging (Reloaded)

Warnings

Page 32: Advanced iOS Debbuging (Reloaded)

Warnings - Objective-C

Page 33: Advanced iOS Debbuging (Reloaded)

Breakpoints

Page 34: Advanced iOS Debbuging (Reloaded)

Creating and editing breakpoint

Page 35: Advanced iOS Debbuging (Reloaded)

Breakpoint Navigator

Page 36: Advanced iOS Debbuging (Reloaded)

Exception Breakpoint

Page 37: Advanced iOS Debbuging (Reloaded)

Symbolic Breakpoint

Page 38: Advanced iOS Debbuging (Reloaded)

Breakpoint Action

Page 39: Advanced iOS Debbuging (Reloaded)

Breakpoint Action

Condition to evaluateThe num of time to ignore breakpoint before stoping

Log Message Action

Debugger Command Action

Play soundContinue program execution

Page 40: Advanced iOS Debbuging (Reloaded)

Debugger Command Actionpo variable

expr (void)NSLog(@”variable: %@”, variable)

breakpoint set -f ADEMasterViewController.m -l 83

Page 41: Advanced iOS Debbuging (Reloaded)

Sharing Breakpoint

Share breakpoints with the team, so that all can bene!t from it

This action will create a new directory to be committed in the repository

AdvanceDebuggingExample.xcodeproj/xcshareddata/

Page 42: Advanced iOS Debbuging (Reloaded)

Demo

Page 43: Advanced iOS Debbuging (Reloaded)

LLDB

Page 44: Advanced iOS Debbuging (Reloaded)

Why LLDB

‣ Consistent Command Syntax

‣ Scriptability with Python

‣ Performance

‣ ...

Page 45: Advanced iOS Debbuging (Reloaded)

LLDB Commands

print object po [object]

print variable print [variable]

assign value expr [variable] = [value]

(lldb) <command>

Page 46: Advanced iOS Debbuging (Reloaded)

LLDB Commands

set breakpoint breakpoint set -f [file] -l [line]

load script command script import ~/test.py

evaluate expression expr <expression>

<noun> <verb> [-options [option-value]] [argument [argument...]]

Page 47: Advanced iOS Debbuging (Reloaded)

Custom Object, the problem

No summary for custom object

@interface KMRMArgument : NSObject

@property (nonatomic, strong) NSString *name;@property (nonatomic, strong) NSDate *detail;

@endKMRMArgument *argument = [[KMRMArgument alloc] init];argument.title = @"Debugging";argument.when = @"Some advance techniques";

Init object

Custom object

Page 48: Advanced iOS Debbuging (Reloaded)

Custom Summary, the solution

‣ Create a Python script that will instruct LLDB on how to display a summary of your custom object

‣ Load your Python script via command line or ~/.lldbinit !le

Page 49: Advanced iOS Debbuging (Reloaded)

Custom Summary

‣ Create “KMRMArgument_summary.py” in Xcode project

‣ Then load script:(lldb) command script import /path/to/KMRMArgument_summary.py

import lldb

def arg_summary(valobj, internal_dict):! nameAsString = valobj.GetChildMemberWithName('_name').GetSummary()! detailAsString = valobj.GetChildMemberWithName('_detail').GetSummary()! return 'Title: ' + nameAsString + ' - detail: ' + detailAsString

def __lldb_init_module(debugger, dict): debugger.HandleCommand('type summary add KRMRArgument -F KRMRArgument_summary.arg_summary')

Page 50: Advanced iOS Debbuging (Reloaded)

Console tips

(lldb) po [self.view recursiveDescription]

$7 = 0x082a2c60 <UITableView: 0x8971000; frame = (0 0; 320 504); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x8184be0>; layer = <CALayer: 0x8184570>; contentOffset: {0, 0}> | <UITableViewCell: 0x8282900; frame = (0 176; 320 44); text = '2013-03-12 21:22:34 +0000'; autoresize = W; layer = <CALayer: 0x8282a30>> | | <UITableViewCellContentView: 0x8282a60; frame = (0 0; 300 43); gestureRecognizers = <NSArray: 0x8282c30>; layer = <CALayer: 0x8282ac0>> | | | <UILabel: 0x8282e50; frame = (10 0; 280 43); text = '2013-03-12 21:22:34 +0000'; clipsToBounds = YES; userInteractionEnabled = NO; layer = <CALayer: 0x8282ee0>>

| | <UIButton: 0x8282c80; frame = (290 0; 30 43); opaque = NO; userInteractionEnabled = NO; layer = ...

(lldb) po [[UIWindow keyWindow] recursiveDescription]$5 = 0x08273bc0 <UIWindow: 0x8181010; frame = (0 0; 320 568); layer = <UIWindowLayer: 0x81810e0>> | <UILayoutContainerView: 0xd06eed0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0xd071460>> | | <UINavigationTransitionView: 0xd09e850; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0xd09e920>> | | | <UIViewControllerWrapperView: 0x846e160; frame = (0 64; 320 504); autoresize = W+H; layer = <CALayer: 0x846e210>>...

Page 51: Advanced iOS Debbuging (Reloaded)

Demo

Page 52: Advanced iOS Debbuging (Reloaded)

Tools

Page 53: Advanced iOS Debbuging (Reloaded)

Tools

‣ Network Link Conditioner

‣ Charles

‣ PonyDebugger

‣ Deploymate

‣ Spark Inspector

Page 54: Advanced iOS Debbuging (Reloaded)

Network Link Conditioner

Page 55: Advanced iOS Debbuging (Reloaded)

Network Link Conditioner

‣ It’s a utility that enables you to simulate network conditions

‣ To install just select Xcode > Open Developer Tool > More Developer Tools. You’ll be taken to Apple’s developer downloads site

‣ Download “Hardware IO Tools for Xcode”

Page 56: Advanced iOS Debbuging (Reloaded)

Network Link Conditioner

Page 57: Advanced iOS Debbuging (Reloaded)

Charles

Page 58: Advanced iOS Debbuging (Reloaded)

Charles Proxy

‣ It’s a web debugging proxy

‣ You can inspect, modify and record requests & responses

‣ SSL Proxinghttp://www.charlesproxy.com/documentation/faqs/ssl-connections-from-within-iphone-applications/

‣ http://www.charlesproxy.com

‣ Price start from US$50

Page 59: Advanced iOS Debbuging (Reloaded)

Charles Proxy

Page 60: Advanced iOS Debbuging (Reloaded)

PonyDebugger

Page 61: Advanced iOS Debbuging (Reloaded)

PonyDebugger

‣ Network Traffic Debugger

‣ Core Data Browser

‣ It is a client library and gateway server combination that uses Chrome Developer Tools on your browser to debug your application's network traffic and managed object contexts.

‣ https://github.com/square/PonyDebugger

Page 62: Advanced iOS Debbuging (Reloaded)

PonyDebugger

Page 63: Advanced iOS Debbuging (Reloaded)

Deploymate

Page 64: Advanced iOS Debbuging (Reloaded)

Deploymate

‣ If using an API introduced later than your target OS but your app is targeting an older OS version, Xcode doesn't warn you about it

‣ It helps identify unavailable, deprecated and obsolete API

‣ http://www.deploymateapp.com/

‣ Price US$19.99

Page 65: Advanced iOS Debbuging (Reloaded)

Deploymate

Page 66: Advanced iOS Debbuging (Reloaded)

Spark Inspector

Page 67: Advanced iOS Debbuging (Reloaded)

Spark Inspector

‣ Runtime Debugger for iOS

‣ Monitor & Experiment in Real-time

‣ See Noti!cations in Real-time

‣ http://sparkinspector.com/

‣ Price € 31,79

Page 68: Advanced iOS Debbuging (Reloaded)

Spark Inspector

Page 69: Advanced iOS Debbuging (Reloaded)

Demo

Page 70: Advanced iOS Debbuging (Reloaded)

Remote

Page 71: Advanced iOS Debbuging (Reloaded)

Remote debugging

‣ Apple Crash Reports

‣ PLCrashReporter

‣ TestFlight

Page 72: Advanced iOS Debbuging (Reloaded)

Apple Crash Reports

Page 73: Advanced iOS Debbuging (Reloaded)

Apple Crash Reports

‣ For app published on App Store, you can acquire crash log from iTunes Connect and import it into Organizer for symbolication

‣ To symbolicate a crash log, Xcode needs to have access to the matching application binary that was uploaded to the App Store, and the .dSYM !le that was generated when that binary was built. This must be an exact match

‣ https://itunesconnect.apple.com

Page 74: Advanced iOS Debbuging (Reloaded)

Apple Crash Reports

Page 75: Advanced iOS Debbuging (Reloaded)

Apple Crash Reports

Page 76: Advanced iOS Debbuging (Reloaded)

Xcode Symbolication

Page 77: Advanced iOS Debbuging (Reloaded)

PLCrashReporter

Page 78: Advanced iOS Debbuging (Reloaded)

PLCrashReporter

‣ In-process CrashReporter framework for the iPhone and Mac OS X

‣ Handles both uncaught Objective-C exceptions and fatal signals

‣ Backtraces for all active threads are provided

‣ https://code.google.com/p/plcrashreporter/

Page 79: Advanced iOS Debbuging (Reloaded)

PLCrashReporter- (void) handleCrashReport { PLCrashReporter *crashReporter = [PLCrashReporter sharedReporter]; NSData *crashData; NSError *error; // Try loading the crash report crashData = [crashReporter loadPendingCrashReportDataAndReturnError: &error]; if (crashData == nil) { NSLog(@"Could not load crash report: %@", error); goto finish; } PLCrashReport *report = [[[PLCrashReport alloc] initWithData: crashData error: &error] autorelease]; if (report == nil) { NSLog(@"Could not parse crash report"); goto finish; } .... return;}

// from UIApplicationDelegate protocol- (void) applicationDidFinishLaunching: (UIApplication *) application { PLCrashReporter *crashReporter = [PLCrashReporter sharedReporter]; NSError *error; // Check if we previously crashed if ([crashReporter hasPendingCrashReport]) [self handleCrashReport]; // Enable the Crash Reporter if (![crashReporter enableCrashReporterAndReturnError: &error]) NSLog(@"Warning: Could not enable crash reporter: %@", error); }

Page 80: Advanced iOS Debbuging (Reloaded)

TestFlight

Page 81: Advanced iOS Debbuging (Reloaded)

TestFlight

‣ Invite your testers, drop in the SDK and start uploading your builds.

‣ Upload your builds and TestFlight takes care of the rest. Painless over-the-air distribution to your testers and distribution lists.

‣ Complete tracking of your build, from distribution to sessions, checkpoints and crashes.

‣ https://test$ightapp.com

Page 82: Advanced iOS Debbuging (Reloaded)

TestFlight Apps Management

Page 83: Advanced iOS Debbuging (Reloaded)

TestFlight Crashes

Page 84: Advanced iOS Debbuging (Reloaded)

Resources

Page 85: Advanced iOS Debbuging (Reloaded)

Resources

‣ Links

‣ Videos

Page 86: Advanced iOS Debbuging (Reloaded)

Links

Page 87: Advanced iOS Debbuging (Reloaded)

Links

‣ Overview of iOS Crash Reporting Toolshttp://www.raywenderlich.com/33669/overview-of-ios-crash-reporting-tools-part-1http://www.raywenderlich.com/33669/overview-of-ios-crash-reporting-tools-part-2

‣ How to use Instruments in Xcodehttp://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode

‣ Demystifying iOS Application Crash Loghttp://www.raywenderlich.com/23704/demystifying-ios-application-crash-logs

Page 89: Advanced iOS Debbuging (Reloaded)

Links

‣ Compiler Warnings for Objective-C Developershttp://oleb.net/blog/2013/04/compiler-warnings-for-objective-c-developers/

‣ Defensive Programming in Cocoahttp://www.mikeash.com/pyblog/friday-qa-2010-08-27-defensive-programming-in-cocoa.html

‣ Testing and Debugging in iOS Simulatorhttps://developer.apple.com/library/ios/#documentation/IDEs/Conceptual/iOS_Simulator_Guide/TestingontheiOSSimulator/TestingontheiOSSimulator.html

Page 90: Advanced iOS Debbuging (Reloaded)

Links

‣ iOS Debugging (slide by Dave Kozol)http://arbormoon.com/sites/default/!les/ASIDebuggingCocoaConfChicago.pdf

‣ Strong, Better, Faster with Instruments and Debugging (slide by Kyle Richter)

http://dragonforged.com/CocoaConf.pdf

‣ LLDB Script Exampleshttp://llvm.org/svn/llvm-project/lldb/trunk/examples/

Page 91: Advanced iOS Debbuging (Reloaded)

Videos

Page 92: Advanced iOS Debbuging (Reloaded)

Videos

‣ WWDC 2012 - 415 - Debugging with LLDB

‣ WWDC 2011 - 321 - Migrating from GDB to LLDB

‣ WWDC 2010 - 316 - Debugging with Xcode 4 and LLDB

‣ NSScreenCast - 002 - Memory Problems

Page 93: Advanced iOS Debbuging (Reloaded)

Final Thoughts

Page 94: Advanced iOS Debbuging (Reloaded)

Final Thoughts

‣ Don’t use NSLog anymore ;)

‣ Create your Xcode Behaviors

‣ Breakpoints are your friends

‣ LLDB is a promising youngster

‣ Tools can save your life

‣ The QA phase is essential