SlideShare a Scribd company logo
매력적인 Xcode 디버깅 팁
ARC, Instruments, DTrace
twitter.com/@godrmOSXDEV.org
오로라플래닛 김정
Single Window
Built-in Interface Builder
LLVM Compiler
LLDB Debugger
Fix-it & Live issue
Assistant
Version Editor
Navigators & Utilities
Multi-window & Multi-tab
Visual Connections (IB)
Refactor
Code Complete
New Instruments
Scheme
Workspace
Debugging
이미지 출처: http://www.dumpanalysis.org/debugging-story-annual-competition
Debugging Tip#1
Breakpoint action
Breakpoint Action
✴ Condition (조건)
✴ Ignore (무시할 반복회수)
✴ Action (동작)
✴ AppleScript, Capture OpenGL ES Frame, Debugger
Command, Log Message, Shell Command, Sound
✴ Options (선택사항)
Exception Breakpoint
✴ 프로젝트 전체 범위
✴ 예외(Exception) 발생할 경우
✴ C++ / Objective-C 형태 예외처리
✴ 동작 설정 가능
Symbolic Breakpoint
✴ 소스 코드의 심벌 이름에 설정
✴ [클래스 +] 메서드 형태 심벌 지정
✴ 모듈 (라이브러리) 지정
LLVM
osxdev.org
Introduction
• LLVM
- Low-Level Virtual Machine
• An Infrastructure for Multi-stage Optimization
- by Chris Arthur Lattner @2002
• Design and Implementation of a compiler infrastructure
- support a unique multi-stage optimization system
- support inter-procedural and profile-driven optimizations
• LLVM virtual instruction (IR)
- with high-level type information
• Sponsored by APPLE
osxdev.org
Compiler Architectures
GCC#4.2#
프론트엔드#
C"
Tree*SSA#
최적화기#
코드 생성기#C++"
Objec)ve+C"
실행파일"
GCC"4.2"
GCC#4.2#
프론트엔드#
C"
LLVM#
최적화기#
LLVM#
코드 생성기#
C++"
Objec)ve+C"
실행파일"
LLVM+GCC"4.2"
Clang#
프론트엔드#
C"
LLVM#
최적화기#
LLVM#
코드 생성기#
C++"
Objec)ve+C"
실행파일"
LLVM"
osxdev.org
Effective LLVM Projects
Xcode
OpenCL
OpenGL Optimize
(speed)
Optimize
(size)
Dynamic
Prog.
Clang
LLDB LLVM
Debugging Tip#2
Static Analysis
osxdev.org
잘못된 예제 코드
CFNumberRef CFNumberError(int param)
{
unsigned int i = 1;
bool isWork = NO;
CFNumberRef x = CFNumberCreate(0, kCFNumberLongType, &i);
if (param==0)
isWork = YES;
return x;
}
void leakError()
{
NSMutableString *aString = [NSMutableString stringWithCapacity:100];
[aString retain];
//...
NSMutableArray *aArray = [[NSMutableArray alloc] initWithCapacity:10];
//...
[aArray removeAllObjects];
//release
}
void NullDerefence(id object)
{
char* pChar = NULL;
///pChar pointer...
*pChar = '!';
}
int uninitialized(int x)
{
int result;
if (x>0) {
result = 1;
}
else if (x==0) {
result = 0;
}
return result;
}
잘못된 사용 (API Misuse)
죽은 코드 (Dead store)
죽은 코드 (Dead store)
잠재된 메모리 누수 (Potential Leak)
널 참조 (Null Dereference)
논리적 오류 (Logic Error)
Debugging Tip#3
ARC vs no-ARC
osxdev.org
ARC
• Automatic Reference Counting
- Automatic memory management of Objective-C objects
- Just Compile-time, Not Run-time
• Not Garbage-Collector
• Migration Tool in Xcode 4.2
- with LLVM 3.0
- build-settings : -fobjc-arc (cf. -fno-objc-arc)
• New Rules
- remove dealloc, retain/release/autorelease
✴ can still use CFRetain / CFRelease in CF
- Can’t use NSAllocateObject / NSDeallocateObject
- Can’t use object pointer in C Structures
- no casual casting id -> void*
- Can’t use NSAutoreleasePool -> @autoreleasepool
- Can’t use memory zone (NSZone)
- Can’t give a property name with new-
Automatic Reference Coun
Debugging Tip#4
Diagnostics
osxdev.org
Diagnostics
• Memory Management
- Malloc
✴ Enable Scribble
✴ Enable Guard Edges
- Guard Malloc
- Objective-C - Zombie Objects
• Logging
- Memory
✴ Distributed Objects
✴ Garbage Collection Activity
✴ Malloc Stack
- Exception
- Dyld API Usage
- Library Loads
• Debugger
- Stop on Debugger() and DebugStr()
2013.02.02 지앤선 테크니컬 세미나 - Xcode를 활용한 디버깅 팁(OSXDEV)
osxdev.org
LLDB
• Next-generation
• & High-performance Debugger
• a set of reusable components in LLVM
• Clang expression parser
• LLVM disassembler
• C/C++, Objective-C
• Efficient Multi-threading, symbol manager
• Extension - Python script
• Support Remote protocol/debug server
osxdev.org
Introduction
GDB
LLDB
% gdb a.out
(gdb) break main
Breakpoint 1 at 0x100000f33:file main.c line4
(gdb) run
% lldb a.out
(lldb) breakpoint set --name main
Breakpoint created:1:name=‘main’, locations=1
(lldb) process launch
osxdev.org
Introduction
GDB
LLDB
(gdb) info args
argc = 1
argv = (const char **) 0x7fff5fbff550
(gdb) info locals
i = 32767
(lldb) frame variable
argc = 1
argv = 0x00007fff5fbfff68
i = 0
osxdev.org
LLDB Command Syntax
Command Syntax
<type> <action> [-options [option-value]] [argument [argument...]]
Uses standard getopt_long() for predicate behavior
(lldb) process launch a.out --stop-at-entry
(lldb) process launch a.out -- --arg0 --arg1
(lldb) process launch a.out -st
Options know which other options they are compatible with
(lldb) process attach --pid 123 --name a.out
Type : breakpoint, commands, frame, image, log, memory, process,
regexp-break, register, settings, source, target, thread
osxdev.org
Common Commands
GDB LLDB
(gdb) ^C
(gdb) signal 2
(gdb) info break
(gdb) continue
(gdb) step
(gdb) stepi
(gdb) next
(gdb) nexti
(gdb) finish
(gdb) info threads
(gdb) backtrace
(lldb) process interrupt
(lldb) process signal SIGINT
(lldb) breakpoint list
(lldb) process continue
(lldb) thread step-in
(lldb) thread step-inst
(lldb) thread step-over
(lldb) thread step-over-inst
(lldb) thread step-out
(lldb) thread list
(lldb) thread backtrace
osxdev.org
Common Commands
GDB LLDB
(gdb) ^C
(gdb) signal 2
(gdb) in br
(gdb) c
(gdb) s
(gdb) si
(gdb) n
(gdb) ni
(gdb) f
(gdb) info threads
(gdb) bt
(lldb) pro int
(lldb) pro s SIGINT
(lldb) br l
(lldb) c
(lldb) s
(lldb) si
(lldb) n
(lldb) ni
(lldb) f
(lldb) th l
(lldb) bt
osxdev.org
Apropos Command
(lldb) apropos thread
The following commands may relate to 'thread':
breakporint command add -- Add a set of commands to a breakpoint, to be executed whenever ...
breakpoint modify -- Modify the options on a breakpoint or set of breakpoints...
breakpoint set -- Sets a breakpoint or set of breakpoints in the executable.
frame -- A set of commands for operating on the current thread's...
frame info -- List information about the currently selected frame in the...
frame select -- Select a frame by index from within the current thread...
log enable -- Enable logging for a single log channel.
process continue -- Continue execution of all threads in the current process.
register -- A set of commands to access thread registers.
thread -- A set of commands for operating on one or more...
thread backtrace -- Show the stack for one or more threads. If no threads are...
thread continue -- Continue execution of one or more threads in an active...
thread list -- Show a summary of all current threads in a process.
thread select -- Select a thread as the currently active thread.
thread step-in -- Source level single step in specified thread (current...
thread step-inst -- Single step one instruction in specified thread (current..
osxdev.org
Expression in LLDB
LLDB
(lldb) expression x+y->getCount()
(int) $0 = 2
(lldb) expression pt
(struct point_tag) $1 = {
(int) x = 2
(int) y = 3
}
(lldb) expression $1.x
(int) $2 = 2
osxdev.org
References
• Apple Documents - Technical Notes
• TN2124 Mac OS X Debugging Magic
• https://developer.apple.com/library/ios/#technotes/tn2004/
tn2124.html#//apple_ref/doc/uid/DTS10003391
• TN2239 iOS Debugging Magic
• https://developer.apple.com/library/ios/#technotes/tn2239/
_index.html#//apple_ref/doc/uid/DTS40010638
InstrumentsXray
새로워진 Instruments #1
✴ The Jump Bar
✴ Improved View Access
✴ Collapsible, Track, Full screen
✴ The Call Tree
✴ Backtrace Compression with Filtering
✴ The Source View
✴ Timeline Flags
- Navigating the improved UI
새로워진 Instruments #2
✴ Immediate vs. Deferred Mode
✴ Immediate mode - “Classic Instruments mode”
✴ Deferred mode
✴ Processes and displays data at end of recording
✴ Vastly reduces “observer effect”
✴ More samples relate to your app.
✴ Launch Daemons and Agents (Mac OS X only)
✴ over Wi-Fi (iPhone OS 3.1+)
✴ Re-Symbolication
- Recording Techniques
새로워진 Instruments #3
✴ Time Profiler
✴ more efficient than CPU Sampler
✴ Deferred mode
✴ Heapshots
✴ Part of Allocation template
✴ VM Tracker
✴ Tracks the virtual memory of a process
- Advancement to existing Instruments
새로워진 Instruments #4
✴ Energy Diagnostics
✴ Provides diagnostics regarding energy usage
✴ Records battery power and CPU usage
✴ Automation
✴ Simulate UI interaction with iOS app.
✴ Leverages JavaScript to script iPhone UI
components
✴ OpenGL ES Analysis
- Significant New Instrumentation
UI Automation
✴ Automates UIKit based applications
✴ Touch based
✴ iPhone, iPod touch and iPhone Simulator
✴ Integrated in Instruments
✴ Accessibility based
✴ JavaScript automation scripts
✴ UI Automation Reference Collection
- What is this?
새로워진 Instruments #4
✴ System Trace
✴ Provides comprehensive information on system
behavior
✴ Identifies when threads are scheduled and why
✴ Display thread transition from user space into
system code
✴ System calls, VM operations
✴ Highlights View - summary
- Really New Instrumentation
DTrace
$ D Language
Software Stack Tools
DTrace is...
✴ dynamic tracing facility
✴ developed by Sun Microsystems
✴ for Solaris 10
✴ designed by Bryan Cantrill, Mike Shapiro, and Adam
Leventhal.
✴ introduced with Leopard (Prior to 10.5 ktrace)
✴ http://hub.opensolaris.org/bin/view/Community+Group
+dtrace/WebHome
✴ http://en.wikipedia.org/wiki/DTrace
osxdev.org
Overview
osxdev.org
DTrace Workflow
osxdev.org
D Language
✴ A Large subset of C
✴ with a special set of functions to analyzing system
behavior.
✴ run in kernel-land.
✴ compiled into a safe form (similar to java bytecode)
✴ validated for safety.
✴ filename extension .d
DTraceToolkit
osxdev.org
DTraceTookits
✴ iosnoop
✴ hfssnoop
✴ execsnoop
✴ opensnoop
✴ dtruss
✴ soconnect_mac
✴ errinfo
✴ bitesize
✴ iotop
✴ maclife
Probes
osxdev.org
Probes
✴ Providers - the instruments
✴ Module - a specific program location
✴ Function - a specific function name
✴ Name - an indication of the probe’s semantic meaning
syscall :: open : entry
syscall :: open* : entry
syscall ::: entry
syscall :::
osxdev.org
BEGIN - END Providers
/* show the BEGIN and END providers
run with:
sudo dtrace -s begin-end.d
*/
BEGIN
{
trace("begin the beguine");
exit(0);
}
END
{
trace("that's all, folks...");
}
osxdev.org
syscall Provider
/* show all system calls being made, system-wide
Run with
sudo dtrace -qs syscalls.d
*/
syscall:::
/execname != "dtrace"/
{
printf("%s fired in %s", probefunc, execname);
}
osxdev.org
profile Provider
/* show the profile (timer) provider.
Run with
sudo dtrace -s lubdub.d
*/
profile:::tick-5sec
{
trace("five second timer");
}
profile:::tick-1min
{
trace("one minute timer");
}
profile:::tick-800msec
{
trace("800 millisecond timer");
}
osxdev.org
proc Provider
/* Show procoess launches across the system.
Run with
sudo dtrace -s execs.d
*/
proc:::exec-success
{
trace(execname);
}
osxdev.org
Actions
✴ the lines of code
✴ assign values to variables, perform computations,
aggregate values over time...
✴ no flow control (no if, no loops)
✴ use predicates
osxdev.org
Variables
✴ C standard types : char, int, short, long, long long...
✴ display floating point values from probes
✴ cannot perform floating point math
✴ cannot cast float to integer
✴ global by default
✴ standard C operators all work
✴ do comparison operators (^^ XOR)
✴ use strcmp()
osxdev.org
example 9.6
/* sings a pretty song.
run with:
sudo dtrace -qs beer.d
*/
int bottles; /* optional */
BEGIN
{
bottles = 99;
}
profile:::tick-1sec
{
printf("%d bottles of beer on the walln", bottles);
printf("%d bottles of beer.n", bottles);
printf("take one down, pass it aroundn");
printf("%d bottles of beer on the wallnn", bottles);
bottles--;
}
END
{
printf("that's all, folks...");
}
osxdev.org
Scoped Variables
✴ Thread-local variable = self->
✴ Clause-local variable = this->
osxdev.org
Built-in Variables
✴ int64_t arg0, arg1, ... arg9
✴ args[]
✴ cwd
✴ errno
✴ execname
✴ pid
✴ stackdepth
✴ timestamp, vtimestamp
✴ probeprov, probemod
✴ probefunc, probename
osxdev.org
example 9.7
/* show all system calls being made, system-wide
Run with
sudo dtrace -qs syscalls.d
*/
syscall:::
/execname != "dtrace"/
{
printf("%s fired in %s", probefunc, execname);
}
osxdev.org
Functions
✴ printf
✴ trace
✴ printa
✴ ustack
✴ exit
✴ copyin, copyinstr
osxdev.org
Arrays
/* calculate the wall-clock time it takes to read()
Run with
sudo dtrace -qs ./readtime.d
*/
syscall::read:entry
{
ts[pid, probefunc] = timestamp;
}
syscall::read:return
/ts[pid, probefunc] != 0/
{
delta = timestamp - ts[pid, probefunc];
printf("read in %s took %d nsecs", execname, delta);
}
osxdev.org
Predicates
✴ logical expressions
✴ enclosed by slashes
/* Watch entry into kevent() */
syscall::kevent:entry
/execname == "dirwatcher" || execname == "DirectoryServic"/
{
printf("%s called kevent()", execname);
}
osxdev.org
Aggregates
✴ count()
✴ sum(expression)
✴ avg(expression)
✴ min(expression)
✴ max(expression)
✴ quantize(expression)
@name[key] = aggfunc()
DTrace Reference Book
ptg
http://www.dtracebook.com/index.php/Main_Page


More Related Content

PDF
Building High Performance Android Applications in Java and C++
PDF
Native code in Android applications
PDF
Tips and tricks for building high performance android apps using native code
KEY
JavaOne 2011 - JVM Bytecode for Dummies
PPT
Building a java tracer
PPTX
Java Bytecode For Discriminating Developers - GeeCON 2011
PPTX
Mastering Java Bytecode - JAX.de 2012
PDF
C++ Advanced Features
Building High Performance Android Applications in Java and C++
Native code in Android applications
Tips and tricks for building high performance android apps using native code
JavaOne 2011 - JVM Bytecode for Dummies
Building a java tracer
Java Bytecode For Discriminating Developers - GeeCON 2011
Mastering Java Bytecode - JAX.de 2012
C++ Advanced Features

What's hot (20)

PDF
C++ Advanced Features
PPT
Android JNI
PDF
JVM Mechanics: When Does the JVM JIT & Deoptimize?
PPTX
Ahead-Of-Time Compilation of Java Applications
PDF
Bytecode manipulation with Javassist and ASM
PPTX
Mastering java bytecode with ASM - GeeCON 2012
PPTX
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
KEY
Runtime
PDF
Eric Lafortune - The Jack and Jill build system
PPTX
Java and OpenJDK: disecting the ecosystem
PDF
Flutter 是什麼?用 Flutter 會省到時間嗎? @ GDG Devfest2020
PPTX
Guild Prototype
PDF
Inside the JVM - Follow the white rabbit!
PPTX
Java 8 and beyond, a scala story
PDF
Introduction to the Java bytecode - So@t - 20130924
PDF
What to expect from Java 9
PDF
JVM for Dummies - OSCON 2011
PPTX
Return of c++
PDF
What Makes Objective C Dynamic?
PDF
Type Profiler: An Analysis to guess type signatures
C++ Advanced Features
Android JNI
JVM Mechanics: When Does the JVM JIT & Deoptimize?
Ahead-Of-Time Compilation of Java Applications
Bytecode manipulation with Javassist and ASM
Mastering java bytecode with ASM - GeeCON 2012
JIT vs. AOT: Unity And Conflict of Dynamic and Static Compilers
Runtime
Eric Lafortune - The Jack and Jill build system
Java and OpenJDK: disecting the ecosystem
Flutter 是什麼?用 Flutter 會省到時間嗎? @ GDG Devfest2020
Guild Prototype
Inside the JVM - Follow the white rabbit!
Java 8 and beyond, a scala story
Introduction to the Java bytecode - So@t - 20130924
What to expect from Java 9
JVM for Dummies - OSCON 2011
Return of c++
What Makes Objective C Dynamic?
Type Profiler: An Analysis to guess type signatures
Ad

Similar to 2013.02.02 지앤선 테크니컬 세미나 - Xcode를 활용한 디버깅 팁(OSXDEV) (20)

PDF
Understanding the Dalvik Virtual Machine
PPT
A Life of breakpoint
PDF
Kandroid for nhn_deview_20131013_v5_final
PDF
ClojureScript for the web
PDF
Specialized Compiler for Hash Cracking
PDF
Native Java with GraalVM
PPTX
Java 7 - New Features - by Mihail Stoynov and Svetlin Nakov
PPTX
IOS debugging
PPTX
Android OpenGL ES Game ImageGrabber Final Report
ODP
Linux kernel tracing superpowers in the cloud
PPTX
Behavior driven oop
PDF
L Fu - Dao: a novel programming language for bioinformatics
PDF
[Td 2015] what is new in visual c++ 2015 and future directions(ulzii luvsanba...
PDF
Eric Lafortune - The Jack and Jill build system
PDF
Swift Install Workshop - OpenStack Conference Spring 2012
PDF
Neal Ford Emergent Design And Evolutionary Architecture
PPTX
NvFX GTC 2013
PPTX
Go Is Your Next Language — Sergii Shapoval
PDF
App container rkt
PDF
Advanced spark training advanced spark internals and tuning reynold xin
Understanding the Dalvik Virtual Machine
A Life of breakpoint
Kandroid for nhn_deview_20131013_v5_final
ClojureScript for the web
Specialized Compiler for Hash Cracking
Native Java with GraalVM
Java 7 - New Features - by Mihail Stoynov and Svetlin Nakov
IOS debugging
Android OpenGL ES Game ImageGrabber Final Report
Linux kernel tracing superpowers in the cloud
Behavior driven oop
L Fu - Dao: a novel programming language for bioinformatics
[Td 2015] what is new in visual c++ 2015 and future directions(ulzii luvsanba...
Eric Lafortune - The Jack and Jill build system
Swift Install Workshop - OpenStack Conference Spring 2012
Neal Ford Emergent Design And Evolutionary Architecture
NvFX GTC 2013
Go Is Your Next Language — Sergii Shapoval
App container rkt
Advanced spark training advanced spark internals and tuning reynold xin
Ad

More from JiandSon (7)

PDF
2015.03.25 테크니컬 세미나 - SonarQube를 활용한 코드 품질 시각화(김모세)
PDF
2015.03.14 Piday in Korea 지앤선 라즈베리 미트업(박종건)
PDF
2013.02.02 지앤선 테크니컬 세미나 - iOS 테스팅 이야기(OSXDEV)
PDF
2013.02.02 지앤선 테크니컬 세미나 - 하둡으로 배우는 대용량 데이터 분산처리 기술(이현남)
PDF
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
PDF
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 씹고 뜯고 맛보고 즐기는 스트림 API(박용권)
PDF
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)
2015.03.25 테크니컬 세미나 - SonarQube를 활용한 코드 품질 시각화(김모세)
2015.03.14 Piday in Korea 지앤선 라즈베리 미트업(박종건)
2013.02.02 지앤선 테크니컬 세미나 - iOS 테스팅 이야기(OSXDEV)
2013.02.02 지앤선 테크니컬 세미나 - 하둡으로 배우는 대용량 데이터 분산처리 기술(이현남)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 씹고 뜯고 맛보고 즐기는 스트림 API(박용권)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)

Recently uploaded (20)

PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
KodekX | Application Modernization Development
PDF
Modernizing your data center with Dell and AMD
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
A Presentation on Artificial Intelligence
PDF
Encapsulation theory and applications.pdf
PDF
Empathic Computing: Creating Shared Understanding
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
Big Data Technologies - Introduction.pptx
PDF
Approach and Philosophy of On baking technology
“AI and Expert System Decision Support & Business Intelligence Systems”
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
The AUB Centre for AI in Media Proposal.docx
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
KodekX | Application Modernization Development
Modernizing your data center with Dell and AMD
Unlocking AI with Model Context Protocol (MCP)
Encapsulation_ Review paper, used for researhc scholars
Digital-Transformation-Roadmap-for-Companies.pptx
A Presentation on Artificial Intelligence
Encapsulation theory and applications.pdf
Empathic Computing: Creating Shared Understanding
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Mobile App Security Testing_ A Comprehensive Guide.pdf
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Big Data Technologies - Introduction.pptx
Approach and Philosophy of On baking technology

2013.02.02 지앤선 테크니컬 세미나 - Xcode를 활용한 디버깅 팁(OSXDEV)

  • 1. 매력적인 Xcode 디버깅 팁 ARC, Instruments, DTrace twitter.com/@godrmOSXDEV.org 오로라플래닛 김정
  • 2. Single Window Built-in Interface Builder LLVM Compiler LLDB Debugger Fix-it & Live issue Assistant Version Editor Navigators & Utilities Multi-window & Multi-tab Visual Connections (IB) Refactor Code Complete New Instruments Scheme Workspace
  • 5. Breakpoint Action ✴ Condition (조건) ✴ Ignore (무시할 반복회수) ✴ Action (동작) ✴ AppleScript, Capture OpenGL ES Frame, Debugger Command, Log Message, Shell Command, Sound ✴ Options (선택사항)
  • 6. Exception Breakpoint ✴ 프로젝트 전체 범위 ✴ 예외(Exception) 발생할 경우 ✴ C++ / Objective-C 형태 예외처리 ✴ 동작 설정 가능
  • 7. Symbolic Breakpoint ✴ 소스 코드의 심벌 이름에 설정 ✴ [클래스 +] 메서드 형태 심벌 지정 ✴ 모듈 (라이브러리) 지정
  • 9. osxdev.org Introduction • LLVM - Low-Level Virtual Machine • An Infrastructure for Multi-stage Optimization - by Chris Arthur Lattner @2002 • Design and Implementation of a compiler infrastructure - support a unique multi-stage optimization system - support inter-procedural and profile-driven optimizations • LLVM virtual instruction (IR) - with high-level type information • Sponsored by APPLE
  • 10. osxdev.org Compiler Architectures GCC#4.2# 프론트엔드# C" Tree*SSA# 최적화기# 코드 생성기#C++" Objec)ve+C" 실행파일" GCC"4.2" GCC#4.2# 프론트엔드# C" LLVM# 최적화기# LLVM# 코드 생성기# C++" Objec)ve+C" 실행파일" LLVM+GCC"4.2" Clang# 프론트엔드# C" LLVM# 최적화기# LLVM# 코드 생성기# C++" Objec)ve+C" 실행파일" LLVM"
  • 11. osxdev.org Effective LLVM Projects Xcode OpenCL OpenGL Optimize (speed) Optimize (size) Dynamic Prog. Clang LLDB LLVM
  • 13. osxdev.org 잘못된 예제 코드 CFNumberRef CFNumberError(int param) { unsigned int i = 1; bool isWork = NO; CFNumberRef x = CFNumberCreate(0, kCFNumberLongType, &i); if (param==0) isWork = YES; return x; } void leakError() { NSMutableString *aString = [NSMutableString stringWithCapacity:100]; [aString retain]; //... NSMutableArray *aArray = [[NSMutableArray alloc] initWithCapacity:10]; //... [aArray removeAllObjects]; //release } void NullDerefence(id object) { char* pChar = NULL; ///pChar pointer... *pChar = '!'; } int uninitialized(int x) { int result; if (x>0) { result = 1; } else if (x==0) { result = 0; } return result; }
  • 17. 잠재된 메모리 누수 (Potential Leak)
  • 18. 널 참조 (Null Dereference)
  • 21. osxdev.org ARC • Automatic Reference Counting - Automatic memory management of Objective-C objects - Just Compile-time, Not Run-time • Not Garbage-Collector • Migration Tool in Xcode 4.2 - with LLVM 3.0 - build-settings : -fobjc-arc (cf. -fno-objc-arc) • New Rules - remove dealloc, retain/release/autorelease ✴ can still use CFRetain / CFRelease in CF - Can’t use NSAllocateObject / NSDeallocateObject - Can’t use object pointer in C Structures - no casual casting id -> void* - Can’t use NSAutoreleasePool -> @autoreleasepool - Can’t use memory zone (NSZone) - Can’t give a property name with new- Automatic Reference Coun
  • 23. osxdev.org Diagnostics • Memory Management - Malloc ✴ Enable Scribble ✴ Enable Guard Edges - Guard Malloc - Objective-C - Zombie Objects • Logging - Memory ✴ Distributed Objects ✴ Garbage Collection Activity ✴ Malloc Stack - Exception - Dyld API Usage - Library Loads • Debugger - Stop on Debugger() and DebugStr()
  • 25. osxdev.org LLDB • Next-generation • & High-performance Debugger • a set of reusable components in LLVM • Clang expression parser • LLVM disassembler • C/C++, Objective-C • Efficient Multi-threading, symbol manager • Extension - Python script • Support Remote protocol/debug server
  • 26. osxdev.org Introduction GDB LLDB % gdb a.out (gdb) break main Breakpoint 1 at 0x100000f33:file main.c line4 (gdb) run % lldb a.out (lldb) breakpoint set --name main Breakpoint created:1:name=‘main’, locations=1 (lldb) process launch
  • 27. osxdev.org Introduction GDB LLDB (gdb) info args argc = 1 argv = (const char **) 0x7fff5fbff550 (gdb) info locals i = 32767 (lldb) frame variable argc = 1 argv = 0x00007fff5fbfff68 i = 0
  • 28. osxdev.org LLDB Command Syntax Command Syntax <type> <action> [-options [option-value]] [argument [argument...]] Uses standard getopt_long() for predicate behavior (lldb) process launch a.out --stop-at-entry (lldb) process launch a.out -- --arg0 --arg1 (lldb) process launch a.out -st Options know which other options they are compatible with (lldb) process attach --pid 123 --name a.out Type : breakpoint, commands, frame, image, log, memory, process, regexp-break, register, settings, source, target, thread
  • 29. osxdev.org Common Commands GDB LLDB (gdb) ^C (gdb) signal 2 (gdb) info break (gdb) continue (gdb) step (gdb) stepi (gdb) next (gdb) nexti (gdb) finish (gdb) info threads (gdb) backtrace (lldb) process interrupt (lldb) process signal SIGINT (lldb) breakpoint list (lldb) process continue (lldb) thread step-in (lldb) thread step-inst (lldb) thread step-over (lldb) thread step-over-inst (lldb) thread step-out (lldb) thread list (lldb) thread backtrace
  • 30. osxdev.org Common Commands GDB LLDB (gdb) ^C (gdb) signal 2 (gdb) in br (gdb) c (gdb) s (gdb) si (gdb) n (gdb) ni (gdb) f (gdb) info threads (gdb) bt (lldb) pro int (lldb) pro s SIGINT (lldb) br l (lldb) c (lldb) s (lldb) si (lldb) n (lldb) ni (lldb) f (lldb) th l (lldb) bt
  • 31. osxdev.org Apropos Command (lldb) apropos thread The following commands may relate to 'thread': breakporint command add -- Add a set of commands to a breakpoint, to be executed whenever ... breakpoint modify -- Modify the options on a breakpoint or set of breakpoints... breakpoint set -- Sets a breakpoint or set of breakpoints in the executable. frame -- A set of commands for operating on the current thread's... frame info -- List information about the currently selected frame in the... frame select -- Select a frame by index from within the current thread... log enable -- Enable logging for a single log channel. process continue -- Continue execution of all threads in the current process. register -- A set of commands to access thread registers. thread -- A set of commands for operating on one or more... thread backtrace -- Show the stack for one or more threads. If no threads are... thread continue -- Continue execution of one or more threads in an active... thread list -- Show a summary of all current threads in a process. thread select -- Select a thread as the currently active thread. thread step-in -- Source level single step in specified thread (current... thread step-inst -- Single step one instruction in specified thread (current..
  • 32. osxdev.org Expression in LLDB LLDB (lldb) expression x+y->getCount() (int) $0 = 2 (lldb) expression pt (struct point_tag) $1 = { (int) x = 2 (int) y = 3 } (lldb) expression $1.x (int) $2 = 2
  • 33. osxdev.org References • Apple Documents - Technical Notes • TN2124 Mac OS X Debugging Magic • https://developer.apple.com/library/ios/#technotes/tn2004/ tn2124.html#//apple_ref/doc/uid/DTS10003391 • TN2239 iOS Debugging Magic • https://developer.apple.com/library/ios/#technotes/tn2239/ _index.html#//apple_ref/doc/uid/DTS40010638
  • 35. 새로워진 Instruments #1 ✴ The Jump Bar ✴ Improved View Access ✴ Collapsible, Track, Full screen ✴ The Call Tree ✴ Backtrace Compression with Filtering ✴ The Source View ✴ Timeline Flags - Navigating the improved UI
  • 36. 새로워진 Instruments #2 ✴ Immediate vs. Deferred Mode ✴ Immediate mode - “Classic Instruments mode” ✴ Deferred mode ✴ Processes and displays data at end of recording ✴ Vastly reduces “observer effect” ✴ More samples relate to your app. ✴ Launch Daemons and Agents (Mac OS X only) ✴ over Wi-Fi (iPhone OS 3.1+) ✴ Re-Symbolication - Recording Techniques
  • 37. 새로워진 Instruments #3 ✴ Time Profiler ✴ more efficient than CPU Sampler ✴ Deferred mode ✴ Heapshots ✴ Part of Allocation template ✴ VM Tracker ✴ Tracks the virtual memory of a process - Advancement to existing Instruments
  • 38. 새로워진 Instruments #4 ✴ Energy Diagnostics ✴ Provides diagnostics regarding energy usage ✴ Records battery power and CPU usage ✴ Automation ✴ Simulate UI interaction with iOS app. ✴ Leverages JavaScript to script iPhone UI components ✴ OpenGL ES Analysis - Significant New Instrumentation
  • 39. UI Automation ✴ Automates UIKit based applications ✴ Touch based ✴ iPhone, iPod touch and iPhone Simulator ✴ Integrated in Instruments ✴ Accessibility based ✴ JavaScript automation scripts ✴ UI Automation Reference Collection - What is this?
  • 40. 새로워진 Instruments #4 ✴ System Trace ✴ Provides comprehensive information on system behavior ✴ Identifies when threads are scheduled and why ✴ Display thread transition from user space into system code ✴ System calls, VM operations ✴ Highlights View - summary - Really New Instrumentation
  • 43. DTrace is... ✴ dynamic tracing facility ✴ developed by Sun Microsystems ✴ for Solaris 10 ✴ designed by Bryan Cantrill, Mike Shapiro, and Adam Leventhal. ✴ introduced with Leopard (Prior to 10.5 ktrace) ✴ http://hub.opensolaris.org/bin/view/Community+Group +dtrace/WebHome ✴ http://en.wikipedia.org/wiki/DTrace
  • 46. osxdev.org D Language ✴ A Large subset of C ✴ with a special set of functions to analyzing system behavior. ✴ run in kernel-land. ✴ compiled into a safe form (similar to java bytecode) ✴ validated for safety. ✴ filename extension .d
  • 48. osxdev.org DTraceTookits ✴ iosnoop ✴ hfssnoop ✴ execsnoop ✴ opensnoop ✴ dtruss ✴ soconnect_mac ✴ errinfo ✴ bitesize ✴ iotop ✴ maclife
  • 50. osxdev.org Probes ✴ Providers - the instruments ✴ Module - a specific program location ✴ Function - a specific function name ✴ Name - an indication of the probe’s semantic meaning syscall :: open : entry syscall :: open* : entry syscall ::: entry syscall :::
  • 51. osxdev.org BEGIN - END Providers /* show the BEGIN and END providers run with: sudo dtrace -s begin-end.d */ BEGIN { trace("begin the beguine"); exit(0); } END { trace("that's all, folks..."); }
  • 52. osxdev.org syscall Provider /* show all system calls being made, system-wide Run with sudo dtrace -qs syscalls.d */ syscall::: /execname != "dtrace"/ { printf("%s fired in %s", probefunc, execname); }
  • 53. osxdev.org profile Provider /* show the profile (timer) provider. Run with sudo dtrace -s lubdub.d */ profile:::tick-5sec { trace("five second timer"); } profile:::tick-1min { trace("one minute timer"); } profile:::tick-800msec { trace("800 millisecond timer"); }
  • 54. osxdev.org proc Provider /* Show procoess launches across the system. Run with sudo dtrace -s execs.d */ proc:::exec-success { trace(execname); }
  • 55. osxdev.org Actions ✴ the lines of code ✴ assign values to variables, perform computations, aggregate values over time... ✴ no flow control (no if, no loops) ✴ use predicates
  • 56. osxdev.org Variables ✴ C standard types : char, int, short, long, long long... ✴ display floating point values from probes ✴ cannot perform floating point math ✴ cannot cast float to integer ✴ global by default ✴ standard C operators all work ✴ do comparison operators (^^ XOR) ✴ use strcmp()
  • 57. osxdev.org example 9.6 /* sings a pretty song. run with: sudo dtrace -qs beer.d */ int bottles; /* optional */ BEGIN { bottles = 99; } profile:::tick-1sec { printf("%d bottles of beer on the walln", bottles); printf("%d bottles of beer.n", bottles); printf("take one down, pass it aroundn"); printf("%d bottles of beer on the wallnn", bottles); bottles--; } END { printf("that's all, folks..."); }
  • 58. osxdev.org Scoped Variables ✴ Thread-local variable = self-> ✴ Clause-local variable = this->
  • 59. osxdev.org Built-in Variables ✴ int64_t arg0, arg1, ... arg9 ✴ args[] ✴ cwd ✴ errno ✴ execname ✴ pid ✴ stackdepth ✴ timestamp, vtimestamp ✴ probeprov, probemod ✴ probefunc, probename
  • 60. osxdev.org example 9.7 /* show all system calls being made, system-wide Run with sudo dtrace -qs syscalls.d */ syscall::: /execname != "dtrace"/ { printf("%s fired in %s", probefunc, execname); }
  • 61. osxdev.org Functions ✴ printf ✴ trace ✴ printa ✴ ustack ✴ exit ✴ copyin, copyinstr
  • 62. osxdev.org Arrays /* calculate the wall-clock time it takes to read() Run with sudo dtrace -qs ./readtime.d */ syscall::read:entry { ts[pid, probefunc] = timestamp; } syscall::read:return /ts[pid, probefunc] != 0/ { delta = timestamp - ts[pid, probefunc]; printf("read in %s took %d nsecs", execname, delta); }
  • 63. osxdev.org Predicates ✴ logical expressions ✴ enclosed by slashes /* Watch entry into kevent() */ syscall::kevent:entry /execname == "dirwatcher" || execname == "DirectoryServic"/ { printf("%s called kevent()", execname); }
  • 64. osxdev.org Aggregates ✴ count() ✴ sum(expression) ✴ avg(expression) ✴ min(expression) ✴ max(expression) ✴ quantize(expression) @name[key] = aggfunc()
  • 66.