SlideShare une entreprise Scribd logo
1  sur  172
Télécharger pour lire hors ligne
More than po:
Debugging in lldb
@MicheleTitolo
lldb
What we’ll cover
• LLDB basics
• Advanced thread, breakpoint, watchpoint
• Debugging with script
• Swift
lldb commands
Basics
po
expr -O --
(lldb) po self.myCar
<Car: 0x7fc8206334d0>
-description
(lldb) po self.myCar
2014 Tesla S UIDeviceRGBColorSpace 0 0 1 1
p
expr --
(lldb) p self.myCar.year
(NSInteger) $1 = 2014
(lldb) p *self.myCar
(Car) $1 = {

NSObject = {

isa = Car

}

_running = NO

_make = 0x000000010077d088 @"Tesla"

_model = 0x000000010077d0a8 @"S"

_year = 2014

_color = 0x00007fd531eb9e30

_gear = Park

}
use expr to modify
values at runtime
(lldb) po self.myCar

2014 Tesla S UIDeviceRGBColorSpace 0 0 1 1

(lldb) po self.myCar

2014 Tesla S UIDeviceRGBColorSpace 0 0 1 1

(lldb) expr self.myCar.year = 2013
(NSInteger) $0 = 2013

(lldb) po self.myCar

2014 Tesla S UIDeviceRGBColorSpace 0 0 1 1

(lldb) expr self.myCar.year = 2013
(NSInteger) $0 = 2013

(lldb) po self.myCar

2013 Tesla S UIDeviceRGBColorSpace 0 0 1 1
frame variable
fr v
(lldb) fr v
(ViewController *) self = 0x00007f9628520cd0

(SEL) _cmd = "updateTipLabelsForBillAmount:"

(float) billAmount = 33

(float) tipPercentage = 0.200000003

(float) tipAmount = 6.5999999

(float) total = 39.5999985
bt
thread backtrace
(lldb) bt
* thread #1: tid = 0x66c2, 0x0000000101a90330 Cars`-[ViewController
viewDidLoad](self=0x00007fc3d2c21570, _cmd=0x0000000102f21cfb) + 448 at
ViewController.m:28, queue = 'com.apple.main-thread', stop reason =
breakpoint 1.1

* frame #0: 0x0000000101a90330 Cars`-[ViewController viewDidLoad]
(self=0x00007fc3d2c21570, _cmd=0x0000000102f21cfb) + 448 at
ViewController.m:28

frame #1: 0x000000010284f090 UIKit`-[UIViewController
loadViewIfRequired] + 738

frame #2: 0x000000010284f28e UIKit`-[UIViewController view] + 27

frame #3: 0x000000010276b5e9 UIKit`-[UIWindow
addRootViewControllerViewIfPossible] + 58

frame #4: 0x000000010276b9af UIKit`-[UIWindow _setHidden:forced:] +
247

frame #5: 0x0000000102778219 UIKit`-[UIWindow makeKeyAndVisible] + 42

frame #6: 0x000000010271b727 UIKit`-[UIApplication
_callInitializationDelegatesForMainScene:transitionContext:] + 2732

frame #7: 0x000000010271e43e UIKit`-[UIApplication
_runWithMainScene:transitionContext:completion:] + 1349

frame #8: 0x000000010271d33c UIKit`-[UIApplication
workspaceDidEndTransaction:] + 179
step / s
next / n
thread step-out /
finish
continue / c
~/.lldbinit
settings set prompt [lldb]$
command alias bd breakpoint disable
command alias be breakpoint enable
command alias bdel breakpoint delete
command alias bcommand breakpoint command add
command alias commands breakpoint command list
help
help breakpoint
help breakpoint
command
help breakpoint
command add
-h --help
-h --help
Thread
thread info
(lldb) thread info
thread #1: tid = 0x66c2, 0x0000000101a90330 Cars`-
[ViewController viewDidLoad](self=0x00007fc3d2c21570,
_cmd=0x0000000102f21cfb) + 448 at ViewController.m:28, queue
= 'com.apple.main-thread', stop reason = breakpoint 1.1
thread list
(lldb) thread list
Process 921 stopped

* thread #1: tid = 0x66c2, 0x0000000101a90330 Cars`-
[ViewController viewDidLoad](self=0x00007fc3d2c21570,
_cmd=0x0000000102f21cfb) + 448 at ViewController.m:28, queue
= 'com.apple.main-thread', stop reason = breakpoint 1.1

thread #2: tid = 0x66da, 0x0000000104bcc232
libsystem_kernel.dylib`kevent64 + 10, queue =
'com.apple.libdispatch-manager'

thread #3: tid = 0x66dc, 0x0000000104bc651a
libsystem_kernel.dylib`semaphore_wait_trap + 10, queue =
'FBSSerialQueue'

thread #4: tid = 0x66dd, 0x0000000104bcb94a
libsystem_kernel.dylib`__workq_kernreturn + 10

thread #5: tid = 0x66de, 0x0000000104bcb94a
libsystem_kernel.dylib`__workq_kernreturn + 10

thread #6: tid = 0x66df, 0x0000000104bcb94a
libsystem_kernel.dylib`__workq_kernreturn + 10
thread until <linenum>
(lldb) thread until 31
Process 1615 resuming

(lldb)
thread return <expr>
(lldb) thread return NO
(lldb) thread return [NSNumber numberWithInt:7]
(lldb) thread return @"Hello"
Breakpoints
breakpoint list
br list
(lldb) br list
Current breakpoints:

1: file = 'Cars/Car.m', line = 50, locations = 1, resolved =
1, hit count = 0



1.1: where = Cars`-[Car changeGearTo:] + 52 at Car.m:50,
address = 0x00000001026fd4e4, resolved, hit count = 0 



2: file = 'Cars/ViewController.m', line = 31, locations = 1,
resolved = 1, hit count = 1



2.1: where = Cars`-[ViewController viewDidLoad] + 512 at
ViewController.m:31, address = 0x00000001026fcb40, resolved,
hit count = 1
br set
br modify
br delete
(lldb) br set -f ViewController.m -l 31
Breakpoint 2: where = Cars`-[ViewController viewDidLoad] +

512 at ViewController.m:31, address = 0x000000010e2bdb40
(lldb) br set -F "-[Car changeGearTo:]”
Breakpoint 3: where = Cars`-[Car changeGearTo:] + 20 at

Car.m:47, address = 0x00000001073ba4c4
br ~= b
(lldb) b ViewController.m:31
(lldb) br ViewController.m:31
error: command 'breakpoint' did not recognize
'ViewController .m:31' as valid (subcommand might be
invalid).
(lldb) b Car.m:63

Breakpoint 2: where = Cars`-[Car increaseSpeedTo:] + 118 at
Car.m:63, address = 0x0000000100b7a576

(lldb) br modify -c "speed==15" 2
(lldb) b Car.m:63

Breakpoint 2: where = Cars`-[Car increaseSpeedTo:] + 118 at
Car.m:63, address = 0x0000000100b7a576

(lldb) br modify -c "speed==15" 2
(lldb) c

Process 3093 resuming

(lldb)
(lldb) br modify -c "speed==15 && self.gear==4” 2
(lldb) br modify -c "speed==20 && [self canChangeGearTo:4]" 2
(lldb) br modify -c "speed==15 && self.gear==4" -i 17 2
-i <count> ( --ignore-count <count> )
Set the number of times this breakpoint is skipped
before stopping.
-i <count> ( --ignore-count <count> )
Set the minimum number of times this breakpoint is skipped
before stopping.
(lldb) br delete 2
1 breakpoints deleted; 0 breakpoint locations disabled.
br enable
br disable
(lldb) breakpoint disable 2
1 breakpoints disabled.


...

2: file = 'Cars/ViewController.m', line = 31, locations = 1
Options: disabled
(lldb) breakpoint enable 2
1 breakpoints enabled.

...

2: file = 'Cars/ViewController.m', line = 31, locations = 1,
resolved = 1, hit count = 1
br command
(lldb) br command add -o "fr v" 2
(lldb) fr v

(Car *) self = 0x00007fb59ad142b0

(SEL) _cmd = "changeGearTo:"

(Gear) gear = Neutral
(lldb) br command add 1
Enter your debugger command(s). Type 'DONE' to end.

> fr v

> continue

> DONE
(lldb) br command add 1
Enter your debugger command(s). Type 'DONE' to end.

> fr v

> continue

> DONE
(lldb) br command add 1
Enter your debugger command(s). Type 'DONE' to end.

> fr v

> continue

> DONE
(lldb) fr v

(Car *) self = 0x00007f8061625490

(SEL) _cmd = "changeGearTo:"

(Gear) gear = Reverse

(lldb) continue

Process 2068 resuming

Command #2 'continue' continued the target.
(lldb) br command list 3
Breakpoint 3:

Breakpoint commands:

fr v
(lldb) br command delete 3
Watchpoints
a watchpoint tracks
a value over time
…kind of like KVO!
[self.myCar addObserver:self

forKeyPath:@"speed"

options:NSKeyValueObservingOptionNew

context:KVOContext];



[self.myCar addObserver:self

forKeyPath:@"speed"

options:NSKeyValueObservingOptionNew

context:KVOContext];



- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object change:(NSDictionary *)change
context:(void *)context

{

if (car.speed > 1000) {

NSLog(@"WHY AM I GOING SO FAST %ld",

(long)car.speed);

}

}
- (void)setSpeed:(NSInteger)speed
{
_speed = speed;
if (_speed > 1000) {
NSLog(@"WHY AM I GOING SO FAST %ld",
(long)_speed);
}
}
breakpoint: place
watchpoint: value
watchpoint set
watch set
(lldb) watch set var self.speed

error: "self" is a pointer and . was used to attempt to

access "speed". Did you mean "self->speed"?
(lldb) watch set var self->speed

error: "speed" is not a member of "(Car *const) self"
(lldb) watch set var _speed
watch modify -c … -i …
(lldb) watch set var _speed
Watchpoint created: Watchpoint 1: addr = 0x7fb9c145d768 size

= 8 state = enabled type = w

watchpoint spec = ‘_speed'

new value: 0
(lldb) watch set var _speed
Watchpoint created: Watchpoint 1: addr = 0x7fb9c145d768 size

= 8 state = enabled type = w

watchpoint spec = ‘_speed'

new value: 0
(lldb) watch modify -c '(_speed==15)'
(lldb) watch set var _speed
Watchpoint created: Watchpoint 1: addr = 0x7fb9c145d768 size

= 8 state = enabled type = w

watchpoint spec = ‘_speed'

new value: 0
(lldb) watch modify -c '(_speed==15)'
(lldb) c

Process 2150 resuming

(lldb) watch set var _speed
Watchpoint created: Watchpoint 1: addr = 0x7fb9c145d768 size

= 8 state = enabled type = w

watchpoint spec = ‘_speed'

new value: 0
(lldb) watch modify -c '(_speed==15)'
(lldb) c

Process 2150 resuming

Watchpoint 1 hit:

old value: 0

new value: 15

(lldb)
(lldb) watch set var _speed

Watchpoint created: Watchpoint 1: addr = 0x7fa3b2e05278 size

= 8 state = enabled type = w

watchpoint spec = ‘_speed'

new value: 0

(lldb) watch modify -c '(_speed==15)'
(lldb) watch set var _speed

Watchpoint created: Watchpoint 1: addr = 0x7fa3b2e05278 size

= 8 state = enabled type = w

watchpoint spec = ‘_speed'

new value: 0

(lldb) watch modify -c '(_speed==15)'
(lldb) watch command add 1
(lldb) watch set var _speed

Watchpoint created: Watchpoint 1: addr = 0x7fa3b2e05278 size

= 8 state = enabled type = w

watchpoint spec = ‘_speed'

new value: 0

(lldb) watch modify -c '(_speed==15)'
(lldb) watch command add 1
Enter your debugger command(s). Type 'DONE' to end.

> p _speed

> continue

> DONE
(lldb) watch set var _speed

Watchpoint created: Watchpoint 1: addr = 0x7fa3b2e05278 size

= 8 state = enabled type = w

watchpoint spec = ‘_speed'

new value: 0

(lldb) watch modify -c '(_speed==15)'
(lldb) watch command add 1
Enter your debugger command(s). Type 'DONE' to end.

> p _speed

> continue

> DONE
(lldb) c

Process 2252 resuming
(lldb) watch set var _speed

Watchpoint created: Watchpoint 1: addr = 0x7fa3b2e05278 size

= 8 state = enabled type = w

watchpoint spec = ‘_speed'

new value: 0

(lldb) watch modify -c '(_speed==15)'
(lldb) watch command add 1
Enter your debugger command(s). Type 'DONE' to end.

> p _speed

> continue

> DONE
(lldb) c

Process 2252 resuming
(NSInteger) $16 = 15

Process 2252 resuming

Command #2 'continue' continued the target.
Stopped due to an error evaluating condition of watchpoint
Watchpoint 1: addr = 0x7f84d940a180 size = 8 state =
disabled type = w: "(_gear==First)"
error: use of undeclared identifier 'First'
error: 1 errors parsing expression
Watchpoint 1 hit:
old value: Park
new value: First
watch delete
watch enable
watch disable
(lldb) watch disable 1

1 watchpoints disabled.
(lldb) watch enable 1

1 watchpoints enabled.
script
write code to debug
your code
rdar://20054190
(Apple closed the previous one !)
>>> if count > 1:
... print "hello"
File "<console>", line 2
print "hello"
^
IndentationError: expected an indented block
>>>
copy + paste
script
(lldb) help script
Pass an expression to the script interpreter for evaluation and
return the results. Drop into the interactive interpreter if no
expression is given. This command takes 'raw' input (no need to
quote stuff).
Syntax: script [<script-expression-for-evaluation>]
(lldb) script

Python Interactive Interpreter. To exit, type 'quit()',
'exit()'.
(lldb) script

Python Interactive Interpreter. To exit, type 'quit()',
'exit()'.
>>> print lldb.debugger
Debugger (instance: "debugger_47", id: 47)
>>> print lldb.target
Cars
>>> print lldb.process
SBProcess: pid = 6425, state = stopped, threads = 5,
executable = Cars
>>> print lldb.thread
SBThread: tid = 0x3813e
>>> print lldb.frame
frame #0: 0x0000000103075979 Cars`-[ViewController
viewDidLoad](self=0x00007f8173f23680,
_cmd=0x0000000104507cfb) + 57 at ViewController.m:24
>>> quit()
writing functions
def breakpoint_func(frame, bp_loc, dict):
# implementation here
# return false to skip
def breakpoint_func(frame, bp_loc, dict):
# implementation here
# return false to skip
current stack frame
def breakpoint_func(frame, bp_loc, dict):
# implementation here
# return false to skip
breakpoint location
def breakpoint_func(frame, bp_loc, dict):
# implementation here
# return false to skip
python session dict
def breakpoint_func(frame, bp_loc, dict):
# implementation here
# return false to skip
python session dictuseless
Sample Case
only stop when
-changeGearTo:
is in the call stack
find_in_stack = ['-[Car changeGearTo:]']
def continue_ignored(frame, bp_loc, dict):
global find_in_stack
names = set([frame.GetFunctionName() for frame 

in frame.GetThread()])
all_ignored = set(find_in_stack)
ignored_here = all_ignored.intersection(names)
if len(ignored_here) == 0:
return False
quit()
find_in_stack = [
def
names = set([frame.GetFunctionName()
all_ignored = set(find_in_stack)
ignored_here = all_ignored.intersection(names)
return False
quit()
find_in_stack = ['-[Car changeGearTo:]']
stack symbol
find_in_stack = [
def
names = set([frame.GetFunctionName()
all_ignored = set(find_in_stack)
ignored_here = all_ignored.intersection(names)
return False
quit()
find_in_stack = ['-[Car changeGearTo:]']
def continue_ignored(frame, bp_loc, dict):
stack symbol
function declaration
find_in_stack = [
def
names = set([frame.GetFunctionName()
all_ignored = set(find_in_stack)
ignored_here = all_ignored.intersection(names)
return False
quit()
find_in_stack = ['-[Car changeGearTo:]']
def continue_ignored(frame, bp_loc, dict):
global find_in_stack
stack symbol
function declaration
global accessor
find_in_stack = [
def
names = set([frame.GetFunctionName()
all_ignored = set(find_in_stack)
ignored_here = all_ignored.intersection(names)
return False
quit()
find_in_stack = ['-[Car changeGearTo:]']
def continue_ignored(frame, bp_loc, dict):
global find_in_stack
names = set([frame.GetFunctionName() for frame 

in frame.GetThread()])
stack symbol
function declaration
global accessor
all functions in stack
find_in_stack = [
def
names = set([frame.GetFunctionName()
all_ignored = set(find_in_stack)
ignored_here = all_ignored.intersection(names)
return False
quit()
find_in_stack = ['-[Car changeGearTo:]']
def continue_ignored(frame, bp_loc, dict):
global find_in_stack
names = set([frame.GetFunctionName() for frame 

in frame.GetThread()])
all_ignored = set(find_in_stack)

ignored_here = all_ignored.intersection(names)
stack symbol
function declaration
global accessor
all functions in stack
check if symbol we want
is in this stack
find_in_stack = [
def
names = set([frame.GetFunctionName()
all_ignored = set(find_in_stack)
ignored_here = all_ignored.intersection(names)
return False
quit()
find_in_stack = ['-[Car changeGearTo:]']
def continue_ignored(frame, bp_loc, dict):
global find_in_stack
names = set([frame.GetFunctionName() for frame 

in frame.GetThread()])
all_ignored = set(find_in_stack)

ignored_here = all_ignored.intersection(names)
if len(ignored_here) == 0:

return False

stack symbol
function declaration
global accessor
all functions in stack
check if symbol we want
is in this stack
if it isn’t, continue
find_in_stack = [
def
names = set([frame.GetFunctionName()
all_ignored = set(find_in_stack)
ignored_here = all_ignored.intersection(names)
return False
quit()
find_in_stack = ['-[Car changeGearTo:]']
def continue_ignored(frame, bp_loc, dict):
global find_in_stack
names = set([frame.GetFunctionName() for frame 

in frame.GetThread()])
all_ignored = set(find_in_stack)

ignored_here = all_ignored.intersection(names)
if len(ignored_here) == 0:

return False

quit()
stack symbol
function declaration
global accessor
all functions in stack
check if symbol we want
is in this stack
if it isn’t, continue
find_in_stack = ['-[Car changeGearTo:]']
def continue_ignored(frame, bp_loc, dict):
global find_in_stack
names = set([frame.GetFunctionName() for frame 

in frame.GetThread()])
all_ignored = set(find_in_stack)
ignored_here = all_ignored.intersection(names)
if len(ignored_here) == 0:
return False
quit()
br command add -s
python #
(lldb) br command add -s python 2
(lldb) br command add -s python 2
Enter your Python command(s). Type 'DONE' to end.

def function(frame,bp_loc,internal_dict):

"""frame: the SBFrame for the location at which you
stopped

bp_loc: an SBBreakpointLocation for the breakpoint
location information

internal_dict: an LLDB support object not to be
used"""
(lldb) br command add -s python 2
Enter your Python command(s). Type 'DONE' to end.

def function(frame,bp_loc,internal_dict):

"""frame: the SBFrame for the location at which you
stopped

bp_loc: an SBBreakpointLocation for the breakpoint
location information

internal_dict: an LLDB support object not to be
used"""
global find_in_stack

find_in_stack = ['-[Car changeGearTo:]']

names = set([frame.GetFunctionName() for frame in
frame.GetThread()])

all_ignored = set(find_in_stack)

ignored_here = all_ignored.intersection(names)

if len(ignored_here) == 0:

return False

DONE
(lldb) br command add -s python 2 -o “print 1+1”
type summary
Use a python function to better
describe a class
def Car_Summary(value,unused):
make = value.GetChildMemberWithName("_make")
model = value.GetChildMemberWithName("_model")
makeSummary = make.GetSummary()
modelSummary = model.GetSummary()
return makeSummary + " " + modelSummary
quit()
def
make = value.GetChildMemberWithName(
model = value.GetChildMemberWithName(
makeSummary = make.GetSummary()
modelSummary = model.GetSummary()
quit()
def Car_Summary(value,unused):
value is the frame
def
make = value.GetChildMemberWithName(
model = value.GetChildMemberWithName(
makeSummary = make.GetSummary()
modelSummary = model.GetSummary()
quit()
def Car_Summary(value,unused):
make = value.GetChildMemberWithName("_make")

model = value.GetChildMemberWithName("_model")
value is the frame
get the variables we want
def
make = value.GetChildMemberWithName(
model = value.GetChildMemberWithName(
makeSummary = make.GetSummary()
modelSummary = model.GetSummary()
quit()
def Car_Summary(value,unused):
make = value.GetChildMemberWithName("_make")

model = value.GetChildMemberWithName("_model")
makeSummary = make.GetSummary()

modelSummary = model.GetSummary()
value is the frame
get the variables we want
printable
summaries
def
make = value.GetChildMemberWithName(
model = value.GetChildMemberWithName(
makeSummary = make.GetSummary()
modelSummary = model.GetSummary()
quit()
def Car_Summary(value,unused):
make = value.GetChildMemberWithName("_make")

model = value.GetChildMemberWithName("_model")
makeSummary = make.GetSummary()

modelSummary = model.GetSummary()
return makeSummary + " " + modelSummary
value is the frame
get the variables we want
printable
summaries
return a string
def
make = value.GetChildMemberWithName(
model = value.GetChildMemberWithName(
makeSummary = make.GetSummary()
modelSummary = model.GetSummary()
quit()
def Car_Summary(value,unused):
make = value.GetChildMemberWithName("_make")

model = value.GetChildMemberWithName("_model")
makeSummary = make.GetSummary()

modelSummary = model.GetSummary()
return makeSummary + " " + modelSummary


quit()
value is the frame
get the variables we want
printable
summaries
return a string
def Car_Summary(value,unused):
make = value.GetChildMemberWithName("_make")
model = value.GetChildMemberWithName("_model")
makeSummary = make.GetSummary()
modelSummary = model.GetSummary()
return makeSummary + " " + modelSummary
quit()
More Use Cases
• Only break after another breakpoint has
been hit
• Check multiple threads for a symbol
• Data formatters for everything
• Custom LLDB commands
More Use Cases
swift
p
(lldb) po self.myCar
<SwiftCars.Car: 0x7fe8bb456a60>

(lldb) p *self.myCar
error: <EXPR>:1:1: error: '*' is not a prefix unary operator

*self.myCar

^
(lldb) fr v -F self.myCar
(lldb) fr v -F self.myCar
self.myCar = 0x00007fe8bb456a60

self.myCar =

self.myCar.isa = SwiftCars.Car

self.myCar.make._core._owner = nil

self.myCar.model._core._owner = nil

self.myCar.color = 0x00007fe8bb452c80

self.myCar.color.isa = UICachedDeviceRGBColor

self.myCar.color._systemColorName = 0x00007fe8bb4424c0
“blueColor"

self.myCar.color.redComponent = 0

self.myCar.color.greenComponent = 0

self.myCar.color.blueComponent = 1

self.myCar.color.alphaComponent = 1

self.myCar.color.cachedColor = 0x0000000000000000

self.myCar.color.cachedColorOnceToken = 0

self.myCar.running.value = 0

self.myCar.gear = Park
type summary
type summary
script
script
find_in_stack = ['SwiftCars.Car.changeGearTo']
App name
file a radar
Resources
• WWDC ’13 Session 413
• WWDC ’14 Sessions 409 & 410
• http://lldb.llvm.org/
• http://www.objc.io/issue-19/lldb-debugging.html
• http://blog.ittybittyapps.com/blog/2013/11/07/
integrating-reveal-without-modifying-your-xcode-
project/
• https://github.com/facebook/chisel
Questions?
@MicheleTitolo

Contenu connexe

Tendances

"Немного о функциональном программирование в JavaScript" Алексей Коваленко
"Немного о функциональном программирование в JavaScript" Алексей Коваленко"Немного о функциональном программирование в JavaScript" Алексей Коваленко
"Немного о функциональном программирование в JavaScript" Алексей КоваленкоFwdays
 
Being functional in PHP (DPC 2016)
Being functional in PHP (DPC 2016)Being functional in PHP (DPC 2016)
Being functional in PHP (DPC 2016)David de Boer
 
Oops practical file
Oops practical fileOops practical file
Oops practical fileAnkit Dixit
 
What We Talk About When We Talk About Unit Testing
What We Talk About When We Talk About Unit TestingWhat We Talk About When We Talk About Unit Testing
What We Talk About When We Talk About Unit TestingKevlin Henney
 
Operator overloading2
Operator overloading2Operator overloading2
Operator overloading2zindadili
 
Programming with GUTs
Programming with GUTsProgramming with GUTs
Programming with GUTsKevlin Henney
 
Меняем javascript с помощью javascript
Меняем javascript с помощью javascriptМеняем javascript с помощью javascript
Меняем javascript с помощью javascriptPavel Volokitin
 
ZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in ScalaZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in ScalaWiem Zine Elabidine
 
Using Redux-Saga for Handling Side Effects
Using Redux-Saga for Handling Side EffectsUsing Redux-Saga for Handling Side Effects
Using Redux-Saga for Handling Side EffectsGlobalLogic Ukraine
 
How to not write a boring test in Golang
How to not write a boring test in GolangHow to not write a boring test in Golang
How to not write a boring test in GolangDan Tran
 
Declaring friend function with inline code
Declaring friend function with inline codeDeclaring friend function with inline code
Declaring friend function with inline codeRajeev Sharan
 
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019corehard_by
 
Ramda, a functional JavaScript library
Ramda, a functional JavaScript libraryRamda, a functional JavaScript library
Ramda, a functional JavaScript libraryDerek Willian Stavis
 

Tendances (20)

"Немного о функциональном программирование в JavaScript" Алексей Коваленко
"Немного о функциональном программирование в JavaScript" Алексей Коваленко"Немного о функциональном программирование в JavaScript" Алексей Коваленко
"Немного о функциональном программирование в JavaScript" Алексей Коваленко
 
Being functional in PHP (DPC 2016)
Being functional in PHP (DPC 2016)Being functional in PHP (DPC 2016)
Being functional in PHP (DPC 2016)
 
Oops practical file
Oops practical fileOops practical file
Oops practical file
 
C++ practical
C++ practicalC++ practical
C++ practical
 
What We Talk About When We Talk About Unit Testing
What We Talk About When We Talk About Unit TestingWhat We Talk About When We Talk About Unit Testing
What We Talk About When We Talk About Unit Testing
 
Operator overloading2
Operator overloading2Operator overloading2
Operator overloading2
 
Functional C++
Functional C++Functional C++
Functional C++
 
Programming with GUTs
Programming with GUTsProgramming with GUTs
Programming with GUTs
 
Меняем javascript с помощью javascript
Меняем javascript с помощью javascriptМеняем javascript с помощью javascript
Меняем javascript с помощью javascript
 
Container adapters
Container adaptersContainer adapters
Container adapters
 
ZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in ScalaZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in Scala
 
Using Redux-Saga for Handling Side Effects
Using Redux-Saga for Handling Side EffectsUsing Redux-Saga for Handling Side Effects
Using Redux-Saga for Handling Side Effects
 
How to not write a boring test in Golang
How to not write a boring test in GolangHow to not write a boring test in Golang
How to not write a boring test in Golang
 
Introduction to Data Oriented Design
Introduction to Data Oriented DesignIntroduction to Data Oriented Design
Introduction to Data Oriented Design
 
ZIO Queue
ZIO QueueZIO Queue
ZIO Queue
 
A Step Towards Data Orientation
A Step Towards Data OrientationA Step Towards Data Orientation
A Step Towards Data Orientation
 
Declaring friend function with inline code
Declaring friend function with inline codeDeclaring friend function with inline code
Declaring friend function with inline code
 
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
 
Static and const members
Static and const membersStatic and const members
Static and const members
 
Ramda, a functional JavaScript library
Ramda, a functional JavaScript libraryRamda, a functional JavaScript library
Ramda, a functional JavaScript library
 

Similaire à More than `po`: Debugging in lldb

Windbg랑 친해지기
Windbg랑 친해지기Windbg랑 친해지기
Windbg랑 친해지기Ji Hun Kim
 
gumiStudy#2 実践 memcached
gumiStudy#2 実践 memcachedgumiStudy#2 実践 memcached
gumiStudy#2 実践 memcachedgumilab
 
HKG15-207: Advanced Toolchain Usage Part 3
HKG15-207: Advanced Toolchain Usage Part 3HKG15-207: Advanced Toolchain Usage Part 3
HKG15-207: Advanced Toolchain Usage Part 3Linaro
 
Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов
Асинхронность и многопоточность в Яндекс.Такси — Дмитрий КуриловАсинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов
Асинхронность и многопоточность в Яндекс.Такси — Дмитрий КуриловYandex
 
HKG15-211: Advanced Toolchain Usage Part 4
HKG15-211: Advanced Toolchain Usage Part 4HKG15-211: Advanced Toolchain Usage Part 4
HKG15-211: Advanced Toolchain Usage Part 4Linaro
 
The Ring programming language version 1.5.2 book - Part 74 of 181
The Ring programming language version 1.5.2 book - Part 74 of 181The Ring programming language version 1.5.2 book - Part 74 of 181
The Ring programming language version 1.5.2 book - Part 74 of 181Mahmoud Samir Fayed
 
Debug Information And Where They Come From
Debug Information And Where They Come FromDebug Information And Where They Come From
Debug Information And Where They Come FromMin-Yih Hsu
 
The Ring programming language version 1.5 book - Part 2 of 31
The Ring programming language version 1.5 book - Part 2 of 31The Ring programming language version 1.5 book - Part 2 of 31
The Ring programming language version 1.5 book - Part 2 of 31Mahmoud Samir Fayed
 
Beginning direct3d gameprogramming05_thebasics_20160421_jintaeks
Beginning direct3d gameprogramming05_thebasics_20160421_jintaeksBeginning direct3d gameprogramming05_thebasics_20160421_jintaeks
Beginning direct3d gameprogramming05_thebasics_20160421_jintaeksJinTaek Seo
 
OpenWorld Sep14 12c for_developers
OpenWorld Sep14 12c for_developersOpenWorld Sep14 12c for_developers
OpenWorld Sep14 12c for_developersConnor McDonald
 
The Ring programming language version 1.6 book - Part 9 of 189
The Ring programming language version 1.6 book - Part 9 of 189The Ring programming language version 1.6 book - Part 9 of 189
The Ring programming language version 1.6 book - Part 9 of 189Mahmoud Samir Fayed
 
The Ring programming language version 1.7 book - Part 10 of 196
The Ring programming language version 1.7 book - Part 10 of 196The Ring programming language version 1.7 book - Part 10 of 196
The Ring programming language version 1.7 book - Part 10 of 196Mahmoud Samir Fayed
 
Hot Code is Faster Code - Addressing JVM Warm-up
Hot Code is Faster Code - Addressing JVM Warm-upHot Code is Faster Code - Addressing JVM Warm-up
Hot Code is Faster Code - Addressing JVM Warm-upMark Price
 
Как работает LLVM бэкенд в C#. Егор Богатов ➠ CoreHard Autumn 2019
Как работает LLVM бэкенд в C#. Егор Богатов ➠ CoreHard Autumn 2019Как работает LLVM бэкенд в C#. Егор Богатов ➠ CoreHard Autumn 2019
Как работает LLVM бэкенд в C#. Егор Богатов ➠ CoreHard Autumn 2019corehard_by
 
Part II: LLVM Intermediate Representation
Part II: LLVM Intermediate RepresentationPart II: LLVM Intermediate Representation
Part II: LLVM Intermediate RepresentationWei-Ren Chen
 

Similaire à More than `po`: Debugging in lldb (20)

Windbg랑 친해지기
Windbg랑 친해지기Windbg랑 친해지기
Windbg랑 친해지기
 
gumiStudy#2 実践 memcached
gumiStudy#2 実践 memcachedgumiStudy#2 実践 memcached
gumiStudy#2 実践 memcached
 
実践 memcached
実践 memcached実践 memcached
実践 memcached
 
HKG15-207: Advanced Toolchain Usage Part 3
HKG15-207: Advanced Toolchain Usage Part 3HKG15-207: Advanced Toolchain Usage Part 3
HKG15-207: Advanced Toolchain Usage Part 3
 
Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов
Асинхронность и многопоточность в Яндекс.Такси — Дмитрий КуриловАсинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов
Асинхронность и многопоточность в Яндекс.Такси — Дмитрий Курилов
 
Boosting Developer Productivity with Clang
Boosting Developer Productivity with ClangBoosting Developer Productivity with Clang
Boosting Developer Productivity with Clang
 
HKG15-211: Advanced Toolchain Usage Part 4
HKG15-211: Advanced Toolchain Usage Part 4HKG15-211: Advanced Toolchain Usage Part 4
HKG15-211: Advanced Toolchain Usage Part 4
 
The Ring programming language version 1.5.2 book - Part 74 of 181
The Ring programming language version 1.5.2 book - Part 74 of 181The Ring programming language version 1.5.2 book - Part 74 of 181
The Ring programming language version 1.5.2 book - Part 74 of 181
 
GCC
GCCGCC
GCC
 
Debug Information And Where They Come From
Debug Information And Where They Come FromDebug Information And Where They Come From
Debug Information And Where They Come From
 
The Ring programming language version 1.5 book - Part 2 of 31
The Ring programming language version 1.5 book - Part 2 of 31The Ring programming language version 1.5 book - Part 2 of 31
The Ring programming language version 1.5 book - Part 2 of 31
 
Beginning direct3d gameprogramming05_thebasics_20160421_jintaeks
Beginning direct3d gameprogramming05_thebasics_20160421_jintaeksBeginning direct3d gameprogramming05_thebasics_20160421_jintaeks
Beginning direct3d gameprogramming05_thebasics_20160421_jintaeks
 
OpenWorld Sep14 12c for_developers
OpenWorld Sep14 12c for_developersOpenWorld Sep14 12c for_developers
OpenWorld Sep14 12c for_developers
 
The Ring programming language version 1.6 book - Part 9 of 189
The Ring programming language version 1.6 book - Part 9 of 189The Ring programming language version 1.6 book - Part 9 of 189
The Ring programming language version 1.6 book - Part 9 of 189
 
The Ring programming language version 1.7 book - Part 10 of 196
The Ring programming language version 1.7 book - Part 10 of 196The Ring programming language version 1.7 book - Part 10 of 196
The Ring programming language version 1.7 book - Part 10 of 196
 
Assemblers
AssemblersAssemblers
Assemblers
 
Hot Code is Faster Code - Addressing JVM Warm-up
Hot Code is Faster Code - Addressing JVM Warm-upHot Code is Faster Code - Addressing JVM Warm-up
Hot Code is Faster Code - Addressing JVM Warm-up
 
ERTS UNIT 3.ppt
ERTS UNIT 3.pptERTS UNIT 3.ppt
ERTS UNIT 3.ppt
 
Как работает LLVM бэкенд в C#. Егор Богатов ➠ CoreHard Autumn 2019
Как работает LLVM бэкенд в C#. Егор Богатов ➠ CoreHard Autumn 2019Как работает LLVM бэкенд в C#. Егор Богатов ➠ CoreHard Autumn 2019
Как работает LLVM бэкенд в C#. Егор Богатов ➠ CoreHard Autumn 2019
 
Part II: LLVM Intermediate Representation
Part II: LLVM Intermediate RepresentationPart II: LLVM Intermediate Representation
Part II: LLVM Intermediate Representation
 

Plus de Michele Titolo

Writing Design Docs for Wide Audiences
Writing Design Docs for Wide AudiencesWriting Design Docs for Wide Audiences
Writing Design Docs for Wide AudiencesMichele Titolo
 
Beam Me Up: Voyaging into Big Data
Beam Me Up: Voyaging into Big DataBeam Me Up: Voyaging into Big Data
Beam Me Up: Voyaging into Big DataMichele Titolo
 
APIs: The Good, The Bad, The Ugly
APIs: The Good, The Bad, The UglyAPIs: The Good, The Bad, The Ugly
APIs: The Good, The Bad, The UglyMichele Titolo
 
Tackling the Big, Impossible Project
Tackling the Big, Impossible ProjectTackling the Big, Impossible Project
Tackling the Big, Impossible ProjectMichele Titolo
 
No Microservice is an Island
No Microservice is an IslandNo Microservice is an Island
No Microservice is an IslandMichele Titolo
 
From iOS to Distributed Systems
From iOS to Distributed SystemsFrom iOS to Distributed Systems
From iOS to Distributed SystemsMichele Titolo
 
APIs for the Mobile World
APIs for the Mobile WorldAPIs for the Mobile World
APIs for the Mobile WorldMichele Titolo
 
Swift Generics in Theory and Practice
Swift Generics in Theory and PracticeSwift Generics in Theory and Practice
Swift Generics in Theory and PracticeMichele Titolo
 
Protocols promised-land-2
Protocols promised-land-2Protocols promised-land-2
Protocols promised-land-2Michele Titolo
 
Making friendly-microservices
Making friendly-microservicesMaking friendly-microservices
Making friendly-microservicesMichele Titolo
 
Can't Handle My Scale v2
Can't Handle My Scale v2Can't Handle My Scale v2
Can't Handle My Scale v2Michele Titolo
 
Cocoa Design Patterns in Swift
Cocoa Design Patterns in SwiftCocoa Design Patterns in Swift
Cocoa Design Patterns in SwiftMichele Titolo
 
Mastering the Project File (AltConf)
Mastering the Project File (AltConf)Mastering the Project File (AltConf)
Mastering the Project File (AltConf)Michele Titolo
 
APIs: The good, the bad, the ugly
APIs: The good, the bad, the uglyAPIs: The good, the bad, the ugly
APIs: The good, the bad, the uglyMichele Titolo
 

Plus de Michele Titolo (20)

Writing Design Docs for Wide Audiences
Writing Design Docs for Wide AudiencesWriting Design Docs for Wide Audiences
Writing Design Docs for Wide Audiences
 
Beam Me Up: Voyaging into Big Data
Beam Me Up: Voyaging into Big DataBeam Me Up: Voyaging into Big Data
Beam Me Up: Voyaging into Big Data
 
APIs: The Good, The Bad, The Ugly
APIs: The Good, The Bad, The UglyAPIs: The Good, The Bad, The Ugly
APIs: The Good, The Bad, The Ugly
 
Tackling the Big, Impossible Project
Tackling the Big, Impossible ProjectTackling the Big, Impossible Project
Tackling the Big, Impossible Project
 
No Microservice is an Island
No Microservice is an IslandNo Microservice is an Island
No Microservice is an Island
 
From iOS to Distributed Systems
From iOS to Distributed SystemsFrom iOS to Distributed Systems
From iOS to Distributed Systems
 
APIs for the Mobile World
APIs for the Mobile WorldAPIs for the Mobile World
APIs for the Mobile World
 
Swift Generics in Theory and Practice
Swift Generics in Theory and PracticeSwift Generics in Theory and Practice
Swift Generics in Theory and Practice
 
Protocols promised-land-2
Protocols promised-land-2Protocols promised-land-2
Protocols promised-land-2
 
Multitasking
MultitaskingMultitasking
Multitasking
 
Making friendly-microservices
Making friendly-microservicesMaking friendly-microservices
Making friendly-microservices
 
The Worst Code
The Worst CodeThe Worst Code
The Worst Code
 
Can't Handle My Scale v2
Can't Handle My Scale v2Can't Handle My Scale v2
Can't Handle My Scale v2
 
Can't Handle My Scale
Can't Handle My ScaleCan't Handle My Scale
Can't Handle My Scale
 
Cocoa Design Patterns in Swift
Cocoa Design Patterns in SwiftCocoa Design Patterns in Swift
Cocoa Design Patterns in Swift
 
Mastering the Project File (AltConf)
Mastering the Project File (AltConf)Mastering the Project File (AltConf)
Mastering the Project File (AltConf)
 
APIs: The Ugly
APIs: The UglyAPIs: The Ugly
APIs: The Ugly
 
That's Not My Code!
That's Not My Code!That's Not My Code!
That's Not My Code!
 
APIs: The good, the bad, the ugly
APIs: The good, the bad, the uglyAPIs: The good, the bad, the ugly
APIs: The good, the bad, the ugly
 
Mobile APIs
Mobile APIsMobile APIs
Mobile APIs
 

Dernier

Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationkaushalgiri8080
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackVICTOR MAESTRE RAMIREZ
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxbodapatigopi8531
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...OnePlan Solutions
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendArshad QA
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 

Dernier (20)

Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
Exploring iOS App Development: Simplifying the Process
Exploring iOS App Development: Simplifying the ProcessExploring iOS App Development: Simplifying the Process
Exploring iOS App Development: Simplifying the Process
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanation
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStack
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptx
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and Backend
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 

More than `po`: Debugging in lldb

  • 1. More than po: Debugging in lldb @MicheleTitolo
  • 2.
  • 4. What we’ll cover • LLDB basics • Advanced thread, breakpoint, watchpoint • Debugging with script • Swift
  • 7. po
  • 9. (lldb) po self.myCar <Car: 0x7fc8206334d0>
  • 11. (lldb) po self.myCar 2014 Tesla S UIDeviceRGBColorSpace 0 0 1 1
  • 12. p
  • 15. (lldb) p *self.myCar (Car) $1 = {
 NSObject = {
 isa = Car
 }
 _running = NO
 _make = 0x000000010077d088 @"Tesla"
 _model = 0x000000010077d0a8 @"S"
 _year = 2014
 _color = 0x00007fd531eb9e30
 _gear = Park
 }
  • 16. use expr to modify values at runtime
  • 17. (lldb) po self.myCar
 2014 Tesla S UIDeviceRGBColorSpace 0 0 1 1

  • 18. (lldb) po self.myCar
 2014 Tesla S UIDeviceRGBColorSpace 0 0 1 1
 (lldb) expr self.myCar.year = 2013 (NSInteger) $0 = 2013

  • 19. (lldb) po self.myCar
 2014 Tesla S UIDeviceRGBColorSpace 0 0 1 1
 (lldb) expr self.myCar.year = 2013 (NSInteger) $0 = 2013
 (lldb) po self.myCar
 2013 Tesla S UIDeviceRGBColorSpace 0 0 1 1
  • 21. fr v
  • 22. (lldb) fr v (ViewController *) self = 0x00007f9628520cd0
 (SEL) _cmd = "updateTipLabelsForBillAmount:"
 (float) billAmount = 33
 (float) tipPercentage = 0.200000003
 (float) tipAmount = 6.5999999
 (float) total = 39.5999985
  • 23. bt
  • 25. (lldb) bt * thread #1: tid = 0x66c2, 0x0000000101a90330 Cars`-[ViewController viewDidLoad](self=0x00007fc3d2c21570, _cmd=0x0000000102f21cfb) + 448 at ViewController.m:28, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
 * frame #0: 0x0000000101a90330 Cars`-[ViewController viewDidLoad] (self=0x00007fc3d2c21570, _cmd=0x0000000102f21cfb) + 448 at ViewController.m:28
 frame #1: 0x000000010284f090 UIKit`-[UIViewController loadViewIfRequired] + 738
 frame #2: 0x000000010284f28e UIKit`-[UIViewController view] + 27
 frame #3: 0x000000010276b5e9 UIKit`-[UIWindow addRootViewControllerViewIfPossible] + 58
 frame #4: 0x000000010276b9af UIKit`-[UIWindow _setHidden:forced:] + 247
 frame #5: 0x0000000102778219 UIKit`-[UIWindow makeKeyAndVisible] + 42
 frame #6: 0x000000010271b727 UIKit`-[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 2732
 frame #7: 0x000000010271e43e UIKit`-[UIApplication _runWithMainScene:transitionContext:completion:] + 1349
 frame #8: 0x000000010271d33c UIKit`-[UIApplication workspaceDidEndTransaction:] + 179
  • 27.
  • 28.
  • 30.
  • 31.
  • 33.
  • 34.
  • 36.
  • 38. settings set prompt [lldb]$ command alias bd breakpoint disable command alias be breakpoint enable command alias bdel breakpoint delete command alias bcommand breakpoint command add command alias commands breakpoint command list
  • 39.
  • 40. help
  • 48. (lldb) thread info thread #1: tid = 0x66c2, 0x0000000101a90330 Cars`- [ViewController viewDidLoad](self=0x00007fc3d2c21570, _cmd=0x0000000102f21cfb) + 448 at ViewController.m:28, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
  • 50. (lldb) thread list Process 921 stopped
 * thread #1: tid = 0x66c2, 0x0000000101a90330 Cars`- [ViewController viewDidLoad](self=0x00007fc3d2c21570, _cmd=0x0000000102f21cfb) + 448 at ViewController.m:28, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
 thread #2: tid = 0x66da, 0x0000000104bcc232 libsystem_kernel.dylib`kevent64 + 10, queue = 'com.apple.libdispatch-manager'
 thread #3: tid = 0x66dc, 0x0000000104bc651a libsystem_kernel.dylib`semaphore_wait_trap + 10, queue = 'FBSSerialQueue'
 thread #4: tid = 0x66dd, 0x0000000104bcb94a libsystem_kernel.dylib`__workq_kernreturn + 10
 thread #5: tid = 0x66de, 0x0000000104bcb94a libsystem_kernel.dylib`__workq_kernreturn + 10
 thread #6: tid = 0x66df, 0x0000000104bcb94a libsystem_kernel.dylib`__workq_kernreturn + 10
  • 52. (lldb) thread until 31 Process 1615 resuming
 (lldb)
  • 54. (lldb) thread return NO (lldb) thread return [NSNumber numberWithInt:7] (lldb) thread return @"Hello"
  • 56.
  • 59. (lldb) br list Current breakpoints:
 1: file = 'Cars/Car.m', line = 50, locations = 1, resolved = 1, hit count = 0
 
 1.1: where = Cars`-[Car changeGearTo:] + 52 at Car.m:50, address = 0x00000001026fd4e4, resolved, hit count = 0 
 
 2: file = 'Cars/ViewController.m', line = 31, locations = 1, resolved = 1, hit count = 1
 
 2.1: where = Cars`-[ViewController viewDidLoad] + 512 at ViewController.m:31, address = 0x00000001026fcb40, resolved, hit count = 1
  • 61. (lldb) br set -f ViewController.m -l 31 Breakpoint 2: where = Cars`-[ViewController viewDidLoad] +
 512 at ViewController.m:31, address = 0x000000010e2bdb40
  • 62. (lldb) br set -F "-[Car changeGearTo:]” Breakpoint 3: where = Cars`-[Car changeGearTo:] + 20 at
 Car.m:47, address = 0x00000001073ba4c4
  • 65. (lldb) br ViewController.m:31 error: command 'breakpoint' did not recognize 'ViewController .m:31' as valid (subcommand might be invalid).
  • 66. (lldb) b Car.m:63
 Breakpoint 2: where = Cars`-[Car increaseSpeedTo:] + 118 at Car.m:63, address = 0x0000000100b7a576
 (lldb) br modify -c "speed==15" 2
  • 67. (lldb) b Car.m:63
 Breakpoint 2: where = Cars`-[Car increaseSpeedTo:] + 118 at Car.m:63, address = 0x0000000100b7a576
 (lldb) br modify -c "speed==15" 2 (lldb) c
 Process 3093 resuming
 (lldb)
  • 68.
  • 69. (lldb) br modify -c "speed==15 && self.gear==4” 2
  • 70. (lldb) br modify -c "speed==20 && [self canChangeGearTo:4]" 2
  • 71. (lldb) br modify -c "speed==15 && self.gear==4" -i 17 2
  • 72. -i <count> ( --ignore-count <count> ) Set the number of times this breakpoint is skipped before stopping.
  • 73. -i <count> ( --ignore-count <count> ) Set the minimum number of times this breakpoint is skipped before stopping.
  • 74. (lldb) br delete 2 1 breakpoints deleted; 0 breakpoint locations disabled.
  • 76. (lldb) breakpoint disable 2 1 breakpoints disabled. 
 ...
 2: file = 'Cars/ViewController.m', line = 31, locations = 1 Options: disabled
  • 77. (lldb) breakpoint enable 2 1 breakpoints enabled.
 ...
 2: file = 'Cars/ViewController.m', line = 31, locations = 1, resolved = 1, hit count = 1
  • 79. (lldb) br command add -o "fr v" 2 (lldb) fr v
 (Car *) self = 0x00007fb59ad142b0
 (SEL) _cmd = "changeGearTo:"
 (Gear) gear = Neutral
  • 80. (lldb) br command add 1 Enter your debugger command(s). Type 'DONE' to end.
 > fr v
 > continue
 > DONE
  • 81. (lldb) br command add 1 Enter your debugger command(s). Type 'DONE' to end.
 > fr v
 > continue
 > DONE
  • 82. (lldb) br command add 1 Enter your debugger command(s). Type 'DONE' to end.
 > fr v
 > continue
 > DONE (lldb) fr v
 (Car *) self = 0x00007f8061625490
 (SEL) _cmd = "changeGearTo:"
 (Gear) gear = Reverse
 (lldb) continue
 Process 2068 resuming
 Command #2 'continue' continued the target.
  • 83. (lldb) br command list 3 Breakpoint 3:
 Breakpoint commands:
 fr v
  • 84. (lldb) br command delete 3
  • 86.
  • 87. a watchpoint tracks a value over time
  • 90. [self.myCar addObserver:self
 forKeyPath:@"speed"
 options:NSKeyValueObservingOptionNew
 context:KVOContext];
 
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
 {
 if (car.speed > 1000) {
 NSLog(@"WHY AM I GOING SO FAST %ld",
 (long)car.speed);
 }
 }
  • 91. - (void)setSpeed:(NSInteger)speed { _speed = speed; if (_speed > 1000) { NSLog(@"WHY AM I GOING SO FAST %ld", (long)_speed); } }
  • 95. (lldb) watch set var self.speed
 error: "self" is a pointer and . was used to attempt to
 access "speed". Did you mean "self->speed"? (lldb) watch set var self->speed
 error: "speed" is not a member of "(Car *const) self" (lldb) watch set var _speed
  • 96. watch modify -c … -i …
  • 97. (lldb) watch set var _speed Watchpoint created: Watchpoint 1: addr = 0x7fb9c145d768 size
 = 8 state = enabled type = w
 watchpoint spec = ‘_speed'
 new value: 0
  • 98. (lldb) watch set var _speed Watchpoint created: Watchpoint 1: addr = 0x7fb9c145d768 size
 = 8 state = enabled type = w
 watchpoint spec = ‘_speed'
 new value: 0 (lldb) watch modify -c '(_speed==15)'
  • 99. (lldb) watch set var _speed Watchpoint created: Watchpoint 1: addr = 0x7fb9c145d768 size
 = 8 state = enabled type = w
 watchpoint spec = ‘_speed'
 new value: 0 (lldb) watch modify -c '(_speed==15)' (lldb) c
 Process 2150 resuming

  • 100. (lldb) watch set var _speed Watchpoint created: Watchpoint 1: addr = 0x7fb9c145d768 size
 = 8 state = enabled type = w
 watchpoint spec = ‘_speed'
 new value: 0 (lldb) watch modify -c '(_speed==15)' (lldb) c
 Process 2150 resuming
 Watchpoint 1 hit:
 old value: 0
 new value: 15
 (lldb)
  • 101.
  • 102. (lldb) watch set var _speed
 Watchpoint created: Watchpoint 1: addr = 0x7fa3b2e05278 size
 = 8 state = enabled type = w
 watchpoint spec = ‘_speed'
 new value: 0
 (lldb) watch modify -c '(_speed==15)'
  • 103. (lldb) watch set var _speed
 Watchpoint created: Watchpoint 1: addr = 0x7fa3b2e05278 size
 = 8 state = enabled type = w
 watchpoint spec = ‘_speed'
 new value: 0
 (lldb) watch modify -c '(_speed==15)' (lldb) watch command add 1
  • 104. (lldb) watch set var _speed
 Watchpoint created: Watchpoint 1: addr = 0x7fa3b2e05278 size
 = 8 state = enabled type = w
 watchpoint spec = ‘_speed'
 new value: 0
 (lldb) watch modify -c '(_speed==15)' (lldb) watch command add 1 Enter your debugger command(s). Type 'DONE' to end.
 > p _speed
 > continue
 > DONE
  • 105. (lldb) watch set var _speed
 Watchpoint created: Watchpoint 1: addr = 0x7fa3b2e05278 size
 = 8 state = enabled type = w
 watchpoint spec = ‘_speed'
 new value: 0
 (lldb) watch modify -c '(_speed==15)' (lldb) watch command add 1 Enter your debugger command(s). Type 'DONE' to end.
 > p _speed
 > continue
 > DONE (lldb) c
 Process 2252 resuming
  • 106. (lldb) watch set var _speed
 Watchpoint created: Watchpoint 1: addr = 0x7fa3b2e05278 size
 = 8 state = enabled type = w
 watchpoint spec = ‘_speed'
 new value: 0
 (lldb) watch modify -c '(_speed==15)' (lldb) watch command add 1 Enter your debugger command(s). Type 'DONE' to end.
 > p _speed
 > continue
 > DONE (lldb) c
 Process 2252 resuming (NSInteger) $16 = 15
 Process 2252 resuming
 Command #2 'continue' continued the target.
  • 107. Stopped due to an error evaluating condition of watchpoint Watchpoint 1: addr = 0x7f84d940a180 size = 8 state = disabled type = w: "(_gear==First)" error: use of undeclared identifier 'First' error: 1 errors parsing expression Watchpoint 1 hit: old value: Park new value: First
  • 109. (lldb) watch disable 1
 1 watchpoints disabled. (lldb) watch enable 1
 1 watchpoints enabled.
  • 110. script
  • 111.
  • 112. write code to debug your code
  • 113.
  • 115. >>> if count > 1: ... print "hello" File "<console>", line 2 print "hello" ^ IndentationError: expected an indented block >>>
  • 116.
  • 118.
  • 119. script
  • 120. (lldb) help script Pass an expression to the script interpreter for evaluation and return the results. Drop into the interactive interpreter if no expression is given. This command takes 'raw' input (no need to quote stuff). Syntax: script [<script-expression-for-evaluation>]
  • 121. (lldb) script
 Python Interactive Interpreter. To exit, type 'quit()', 'exit()'.
  • 122. (lldb) script
 Python Interactive Interpreter. To exit, type 'quit()', 'exit()'. >>> print lldb.debugger Debugger (instance: "debugger_47", id: 47) >>> print lldb.target Cars >>> print lldb.process SBProcess: pid = 6425, state = stopped, threads = 5, executable = Cars >>> print lldb.thread SBThread: tid = 0x3813e >>> print lldb.frame frame #0: 0x0000000103075979 Cars`-[ViewController viewDidLoad](self=0x00007f8173f23680, _cmd=0x0000000104507cfb) + 57 at ViewController.m:24 >>> quit()
  • 124. def breakpoint_func(frame, bp_loc, dict): # implementation here # return false to skip
  • 125. def breakpoint_func(frame, bp_loc, dict): # implementation here # return false to skip current stack frame
  • 126. def breakpoint_func(frame, bp_loc, dict): # implementation here # return false to skip breakpoint location
  • 127. def breakpoint_func(frame, bp_loc, dict): # implementation here # return false to skip python session dict
  • 128. def breakpoint_func(frame, bp_loc, dict): # implementation here # return false to skip python session dictuseless
  • 130. only stop when -changeGearTo: is in the call stack
  • 131. find_in_stack = ['-[Car changeGearTo:]'] def continue_ignored(frame, bp_loc, dict): global find_in_stack names = set([frame.GetFunctionName() for frame 
 in frame.GetThread()]) all_ignored = set(find_in_stack) ignored_here = all_ignored.intersection(names) if len(ignored_here) == 0: return False quit()
  • 132. find_in_stack = [ def names = set([frame.GetFunctionName() all_ignored = set(find_in_stack) ignored_here = all_ignored.intersection(names) return False quit() find_in_stack = ['-[Car changeGearTo:]'] stack symbol
  • 133. find_in_stack = [ def names = set([frame.GetFunctionName() all_ignored = set(find_in_stack) ignored_here = all_ignored.intersection(names) return False quit() find_in_stack = ['-[Car changeGearTo:]'] def continue_ignored(frame, bp_loc, dict): stack symbol function declaration
  • 134. find_in_stack = [ def names = set([frame.GetFunctionName() all_ignored = set(find_in_stack) ignored_here = all_ignored.intersection(names) return False quit() find_in_stack = ['-[Car changeGearTo:]'] def continue_ignored(frame, bp_loc, dict): global find_in_stack stack symbol function declaration global accessor
  • 135. find_in_stack = [ def names = set([frame.GetFunctionName() all_ignored = set(find_in_stack) ignored_here = all_ignored.intersection(names) return False quit() find_in_stack = ['-[Car changeGearTo:]'] def continue_ignored(frame, bp_loc, dict): global find_in_stack names = set([frame.GetFunctionName() for frame 
 in frame.GetThread()]) stack symbol function declaration global accessor all functions in stack
  • 136. find_in_stack = [ def names = set([frame.GetFunctionName() all_ignored = set(find_in_stack) ignored_here = all_ignored.intersection(names) return False quit() find_in_stack = ['-[Car changeGearTo:]'] def continue_ignored(frame, bp_loc, dict): global find_in_stack names = set([frame.GetFunctionName() for frame 
 in frame.GetThread()]) all_ignored = set(find_in_stack)
 ignored_here = all_ignored.intersection(names) stack symbol function declaration global accessor all functions in stack check if symbol we want is in this stack
  • 137. find_in_stack = [ def names = set([frame.GetFunctionName() all_ignored = set(find_in_stack) ignored_here = all_ignored.intersection(names) return False quit() find_in_stack = ['-[Car changeGearTo:]'] def continue_ignored(frame, bp_loc, dict): global find_in_stack names = set([frame.GetFunctionName() for frame 
 in frame.GetThread()]) all_ignored = set(find_in_stack)
 ignored_here = all_ignored.intersection(names) if len(ignored_here) == 0:
 return False
 stack symbol function declaration global accessor all functions in stack check if symbol we want is in this stack if it isn’t, continue
  • 138. find_in_stack = [ def names = set([frame.GetFunctionName() all_ignored = set(find_in_stack) ignored_here = all_ignored.intersection(names) return False quit() find_in_stack = ['-[Car changeGearTo:]'] def continue_ignored(frame, bp_loc, dict): global find_in_stack names = set([frame.GetFunctionName() for frame 
 in frame.GetThread()]) all_ignored = set(find_in_stack)
 ignored_here = all_ignored.intersection(names) if len(ignored_here) == 0:
 return False
 quit() stack symbol function declaration global accessor all functions in stack check if symbol we want is in this stack if it isn’t, continue
  • 139. find_in_stack = ['-[Car changeGearTo:]'] def continue_ignored(frame, bp_loc, dict): global find_in_stack names = set([frame.GetFunctionName() for frame 
 in frame.GetThread()]) all_ignored = set(find_in_stack) ignored_here = all_ignored.intersection(names) if len(ignored_here) == 0: return False quit()
  • 140.
  • 141.
  • 142. br command add -s python #
  • 143.
  • 144. (lldb) br command add -s python 2
  • 145. (lldb) br command add -s python 2 Enter your Python command(s). Type 'DONE' to end.
 def function(frame,bp_loc,internal_dict):
 """frame: the SBFrame for the location at which you stopped
 bp_loc: an SBBreakpointLocation for the breakpoint location information
 internal_dict: an LLDB support object not to be used"""
  • 146. (lldb) br command add -s python 2 Enter your Python command(s). Type 'DONE' to end.
 def function(frame,bp_loc,internal_dict):
 """frame: the SBFrame for the location at which you stopped
 bp_loc: an SBBreakpointLocation for the breakpoint location information
 internal_dict: an LLDB support object not to be used""" global find_in_stack
 find_in_stack = ['-[Car changeGearTo:]']
 names = set([frame.GetFunctionName() for frame in frame.GetThread()])
 all_ignored = set(find_in_stack)
 ignored_here = all_ignored.intersection(names)
 if len(ignored_here) == 0:
 return False
 DONE
  • 147. (lldb) br command add -s python 2 -o “print 1+1”
  • 149. Use a python function to better describe a class
  • 150. def Car_Summary(value,unused): make = value.GetChildMemberWithName("_make") model = value.GetChildMemberWithName("_model") makeSummary = make.GetSummary() modelSummary = model.GetSummary() return makeSummary + " " + modelSummary quit()
  • 151. def make = value.GetChildMemberWithName( model = value.GetChildMemberWithName( makeSummary = make.GetSummary() modelSummary = model.GetSummary() quit() def Car_Summary(value,unused): value is the frame
  • 152. def make = value.GetChildMemberWithName( model = value.GetChildMemberWithName( makeSummary = make.GetSummary() modelSummary = model.GetSummary() quit() def Car_Summary(value,unused): make = value.GetChildMemberWithName("_make")
 model = value.GetChildMemberWithName("_model") value is the frame get the variables we want
  • 153. def make = value.GetChildMemberWithName( model = value.GetChildMemberWithName( makeSummary = make.GetSummary() modelSummary = model.GetSummary() quit() def Car_Summary(value,unused): make = value.GetChildMemberWithName("_make")
 model = value.GetChildMemberWithName("_model") makeSummary = make.GetSummary()
 modelSummary = model.GetSummary() value is the frame get the variables we want printable summaries
  • 154. def make = value.GetChildMemberWithName( model = value.GetChildMemberWithName( makeSummary = make.GetSummary() modelSummary = model.GetSummary() quit() def Car_Summary(value,unused): make = value.GetChildMemberWithName("_make")
 model = value.GetChildMemberWithName("_model") makeSummary = make.GetSummary()
 modelSummary = model.GetSummary() return makeSummary + " " + modelSummary value is the frame get the variables we want printable summaries return a string
  • 155. def make = value.GetChildMemberWithName( model = value.GetChildMemberWithName( makeSummary = make.GetSummary() modelSummary = model.GetSummary() quit() def Car_Summary(value,unused): make = value.GetChildMemberWithName("_make")
 model = value.GetChildMemberWithName("_model") makeSummary = make.GetSummary()
 modelSummary = model.GetSummary() return makeSummary + " " + modelSummary 
 quit() value is the frame get the variables we want printable summaries return a string
  • 156. def Car_Summary(value,unused): make = value.GetChildMemberWithName("_make") model = value.GetChildMemberWithName("_model") makeSummary = make.GetSummary() modelSummary = model.GetSummary() return makeSummary + " " + modelSummary quit()
  • 157.
  • 159. • Only break after another breakpoint has been hit • Check multiple threads for a symbol • Data formatters for everything • Custom LLDB commands More Use Cases
  • 160. swift
  • 161. p
  • 162. (lldb) po self.myCar <SwiftCars.Car: 0x7fe8bb456a60>
 (lldb) p *self.myCar error: <EXPR>:1:1: error: '*' is not a prefix unary operator
 *self.myCar
 ^
  • 163. (lldb) fr v -F self.myCar
  • 164. (lldb) fr v -F self.myCar self.myCar = 0x00007fe8bb456a60
 self.myCar =
 self.myCar.isa = SwiftCars.Car
 self.myCar.make._core._owner = nil
 self.myCar.model._core._owner = nil
 self.myCar.color = 0x00007fe8bb452c80
 self.myCar.color.isa = UICachedDeviceRGBColor
 self.myCar.color._systemColorName = 0x00007fe8bb4424c0 “blueColor"
 self.myCar.color.redComponent = 0
 self.myCar.color.greenComponent = 0
 self.myCar.color.blueComponent = 1
 self.myCar.color.alphaComponent = 1
 self.myCar.color.cachedColor = 0x0000000000000000
 self.myCar.color.cachedColorOnceToken = 0
 self.myCar.running.value = 0
 self.myCar.gear = Park
  • 167. script
  • 168. script
  • 171. Resources • WWDC ’13 Session 413 • WWDC ’14 Sessions 409 & 410 • http://lldb.llvm.org/ • http://www.objc.io/issue-19/lldb-debugging.html • http://blog.ittybittyapps.com/blog/2013/11/07/ integrating-reveal-without-modifying-your-xcode- project/ • https://github.com/facebook/chisel