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
 
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
 
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
 
Chapter7.pptx
Chapter7.pptxChapter7.pptx
Chapter7.pptxradhushri
 
The Ring programming language version 1.10 book - Part 15 of 212
The Ring programming language version 1.10 book - Part 15 of 212The Ring programming language version 1.10 book - Part 15 of 212
The Ring programming language version 1.10 book - Part 15 of 212Mahmoud Samir Fayed
 
Aplikasi pemograman mikrokontroler
Aplikasi pemograman mikrokontrolerAplikasi pemograman mikrokontroler
Aplikasi pemograman mikrokontrolerarie eric
 
basic computer programming and micro programmed control
basic computer programming and micro programmed controlbasic computer programming and micro programmed control
basic computer programming and micro programmed controlRai University
 
B.sc cs-ii-u-3.2-basic computer programming and micro programmed control
B.sc cs-ii-u-3.2-basic computer programming and micro programmed controlB.sc cs-ii-u-3.2-basic computer programming and micro programmed control
B.sc cs-ii-u-3.2-basic computer programming and micro programmed controlRai University
 

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
 
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
 
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
 
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
 
Chapter7.pptx
Chapter7.pptxChapter7.pptx
Chapter7.pptx
 
The Ring programming language version 1.10 book - Part 15 of 212
The Ring programming language version 1.10 book - Part 15 of 212The Ring programming language version 1.10 book - Part 15 of 212
The Ring programming language version 1.10 book - Part 15 of 212
 
Aplikasi pemograman mikrokontroler
Aplikasi pemograman mikrokontrolerAplikasi pemograman mikrokontroler
Aplikasi pemograman mikrokontroler
 
basic computer programming and micro programmed control
basic computer programming and micro programmed controlbasic computer programming and micro programmed control
basic computer programming and micro programmed control
 
chapter 4
chapter 4chapter 4
chapter 4
 
B.sc cs-ii-u-3.2-basic computer programming and micro programmed control
B.sc cs-ii-u-3.2-basic computer programming and micro programmed controlB.sc cs-ii-u-3.2-basic computer programming and micro programmed control
B.sc cs-ii-u-3.2-basic computer programming and micro programmed control
 

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

CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceBrainSell Technologies
 
PREDICTING RIVER WATER QUALITY ppt presentation
PREDICTING  RIVER  WATER QUALITY  ppt presentationPREDICTING  RIVER  WATER QUALITY  ppt presentation
PREDICTING RIVER WATER QUALITY ppt presentationvaddepallysandeep122
 
How To Manage Restaurant Staff -BTRESTRO
How To Manage Restaurant Staff -BTRESTROHow To Manage Restaurant Staff -BTRESTRO
How To Manage Restaurant Staff -BTRESTROmotivationalword821
 
VK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web DevelopmentVK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web Developmentvyaparkranti
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odishasmiwainfosol
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Velvetech LLC
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZABSYZ Inc
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringHironori Washizaki
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
Comparing Linux OS Image Update Models - EOSS 2024.pdf
Comparing Linux OS Image Update Models - EOSS 2024.pdfComparing Linux OS Image Update Models - EOSS 2024.pdf
Comparing Linux OS Image Update Models - EOSS 2024.pdfDrew Moseley
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commercemanigoyal112
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEEVICTOR MAESTRE RAMIREZ
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Angel Borroy López
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...OnePlan Solutions
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfAlina Yurenko
 
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Natan Silnitsky
 
Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprisepreethippts
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Cizo Technology Services
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsSafe Software
 

Dernier (20)

CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. Salesforce
 
PREDICTING RIVER WATER QUALITY ppt presentation
PREDICTING  RIVER  WATER QUALITY  ppt presentationPREDICTING  RIVER  WATER QUALITY  ppt presentation
PREDICTING RIVER WATER QUALITY ppt presentation
 
How To Manage Restaurant Staff -BTRESTRO
How To Manage Restaurant Staff -BTRESTROHow To Manage Restaurant Staff -BTRESTRO
How To Manage Restaurant Staff -BTRESTRO
 
VK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web DevelopmentVK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web Development
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZ
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their Engineering
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
Comparing Linux OS Image Update Models - EOSS 2024.pdf
Comparing Linux OS Image Update Models - EOSS 2024.pdfComparing Linux OS Image Update Models - EOSS 2024.pdf
Comparing Linux OS Image Update Models - EOSS 2024.pdf
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commerce
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEE
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
 
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
 
Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprise
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data Streams
 

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