SlideShare a Scribd company logo
1 of 140
Download to read offline
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) 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
process
(lldb) process attach -p 5416
Process 5416 stopped

* thread #1: tid = 0xe4b02, 0x0000000106e234de

libsystem_kernel.dylib`mach_msg_trap + 10, queue = 'com.apple.main

thread', stop reason = signal SIGSTOP

frame #0: 0x0000000106e234de libsystem_kernel.dylib`mach_msg_trap +

10

libsystem_kernel.dylib`mach_msg_trap:

-> 0x106e234de <+10>: retq

0x106e234df <+11>: nop



libsystem_kernel.dylib`mach_msg_overwrite_trap:

0x106e234e0 <+0>: movq %rcx, %r10

0x106e234e3 <+3>: movl $0x1000020, %eax



Executable module set to "/Users/michele/Library/Developer/CoreSimulator/
Devices/5304657F-1710-42A1-87CA-E5358E87F4C8/data/Containers/Bundle/
Application/312BA401-3B1E-4A17-B7E8-BAAAE13EC463/Cars.app/Cars".

Architecture set to: x86_64h-apple-ios.
(lldb) c
Process 5416 resuming
help
help breakpoint
help breakpoint
command
help breakpoint
command add
-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) 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) 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];



- (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 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 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
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()'.
>>> 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
current stack framebreakpoint locationpython 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:]']
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
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):
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()
• 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
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
calling functions
(lldb) po self.canChangeGearTo(0)
error: property 'canChangeGearTo' not found on object of
type 'Car *'

error: 1 errors parsing expression
frame lang == lldb lang
script
find_in_stack = ['SwiftCars.Car.changeGearTo']
App name
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
• https://developer.apple.com/library/mac/documentation/
IDEs/Conceptual/gdb_to_lldb_transition_guide/
document/lldb-terminal-workflow-tutorial.html
Questions?
@MicheleTitolo

More Related Content

What's hot

Score (smart contract for icon)
Score (smart contract for icon) Score (smart contract for icon)
Score (smart contract for icon) Doyun Hwang
 
Oops practical file
Oops practical fileOops practical file
Oops practical fileAnkit Dixit
 
Agile Database Development with JSON
Agile Database Development with JSONAgile Database Development with JSON
Agile Database Development with JSONChris Saxon
 
Operator overloading2
Operator overloading2Operator overloading2
Operator overloading2zindadili
 
The Ring programming language version 1.5.1 book - Part 73 of 180
The Ring programming language version 1.5.1 book - Part 73 of 180The Ring programming language version 1.5.1 book - Part 73 of 180
The Ring programming language version 1.5.1 book - Part 73 of 180Mahmoud Samir Fayed
 
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019corehard_by
 
Hypercritical C++ Code Review
Hypercritical C++ Code ReviewHypercritical C++ Code Review
Hypercritical C++ Code ReviewAndrey Karpov
 
The Challenge of Bringing FEZ to PlayStation Platforms
The Challenge of Bringing FEZ to PlayStation PlatformsThe Challenge of Bringing FEZ to PlayStation Platforms
The Challenge of Bringing FEZ to PlayStation PlatformsMiguel Angel Horna
 
Ruby closures, how are they possible?
Ruby closures, how are they possible?Ruby closures, how are they possible?
Ruby closures, how are they possible?Carlos Alonso Pérez
 
Developing RESTful Services in .NET
Developing RESTful Services in .NETDeveloping RESTful Services in .NET
Developing RESTful Services in .NETRobert MacLean
 
Games, AI, and Research - Part 2 Training (FightingICE AI Programming)
Games, AI, and Research - Part 2 Training (FightingICE AI Programming)Games, AI, and Research - Part 2 Training (FightingICE AI Programming)
Games, AI, and Research - Part 2 Training (FightingICE AI Programming)Pujana Paliyawan
 
Writing SOLID C++ [gbgcpp meetup @ Zenseact]
Writing SOLID C++ [gbgcpp meetup @ Zenseact]Writing SOLID C++ [gbgcpp meetup @ Zenseact]
Writing SOLID C++ [gbgcpp meetup @ Zenseact]Dimitrios Platis
 
ECMAScript 6 Review
ECMAScript 6 ReviewECMAScript 6 Review
ECMAScript 6 ReviewSperasoft
 
Formal Verification of Transactional Interaction Contract
Formal Verification of Transactional Interaction ContractFormal Verification of Transactional Interaction Contract
Formal Verification of Transactional Interaction ContractGera Shegalov
 

What's hot (20)

Score (smart contract for icon)
Score (smart contract for icon) Score (smart contract for icon)
Score (smart contract for icon)
 
Oops practical file
Oops practical fileOops practical file
Oops practical file
 
Performance tests - it's a trap
Performance tests - it's a trapPerformance tests - it's a trap
Performance tests - it's a trap
 
Agile Database Development with JSON
Agile Database Development with JSONAgile Database Development with JSON
Agile Database Development with JSON
 
Container adapters
Container adaptersContainer adapters
Container adapters
 
Scala to assembly
Scala to assemblyScala to assembly
Scala to assembly
 
C++ practical
C++ practicalC++ practical
C++ practical
 
Java Program
Java ProgramJava Program
Java Program
 
Operator overloading2
Operator overloading2Operator overloading2
Operator overloading2
 
The Ring programming language version 1.5.1 book - Part 73 of 180
The Ring programming language version 1.5.1 book - Part 73 of 180The Ring programming language version 1.5.1 book - Part 73 of 180
The Ring programming language version 1.5.1 book - Part 73 of 180
 
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
 
Hypercritical C++ Code Review
Hypercritical C++ Code ReviewHypercritical C++ Code Review
Hypercritical C++ Code Review
 
Oracle 11g caracteristicas poco documentadas 3 en 1
Oracle 11g caracteristicas poco documentadas 3 en 1Oracle 11g caracteristicas poco documentadas 3 en 1
Oracle 11g caracteristicas poco documentadas 3 en 1
 
The Challenge of Bringing FEZ to PlayStation Platforms
The Challenge of Bringing FEZ to PlayStation PlatformsThe Challenge of Bringing FEZ to PlayStation Platforms
The Challenge of Bringing FEZ to PlayStation Platforms
 
Ruby closures, how are they possible?
Ruby closures, how are they possible?Ruby closures, how are they possible?
Ruby closures, how are they possible?
 
Developing RESTful Services in .NET
Developing RESTful Services in .NETDeveloping RESTful Services in .NET
Developing RESTful Services in .NET
 
Games, AI, and Research - Part 2 Training (FightingICE AI Programming)
Games, AI, and Research - Part 2 Training (FightingICE AI Programming)Games, AI, and Research - Part 2 Training (FightingICE AI Programming)
Games, AI, and Research - Part 2 Training (FightingICE AI Programming)
 
Writing SOLID C++ [gbgcpp meetup @ Zenseact]
Writing SOLID C++ [gbgcpp meetup @ Zenseact]Writing SOLID C++ [gbgcpp meetup @ Zenseact]
Writing SOLID C++ [gbgcpp meetup @ Zenseact]
 
ECMAScript 6 Review
ECMAScript 6 ReviewECMAScript 6 Review
ECMAScript 6 Review
 
Formal Verification of Transactional Interaction Contract
Formal Verification of Transactional Interaction ContractFormal Verification of Transactional Interaction Contract
Formal Verification of Transactional Interaction Contract
 

Viewers also liked

Protocols promised-land-2
Protocols promised-land-2Protocols promised-land-2
Protocols promised-land-2Michele Titolo
 
Είμαι καταδικασμένος ?
Είμαι καταδικασμένος ?Είμαι καταδικασμένος ?
Είμαι καταδικασμένος ?Dr Dimitrios Thanassas
 
spoken english syllabus - Power point
spoken english syllabus - Power pointspoken english syllabus - Power point
spoken english syllabus - Power pointMoses Collinns
 
Digital Marketing for Trading Companies
Digital Marketing for Trading CompaniesDigital Marketing for Trading Companies
Digital Marketing for Trading CompaniesOxygen 2.0
 
Imo38013802 istatistik -2
Imo38013802 istatistik -2Imo38013802 istatistik -2
Imo38013802 istatistik -2serkanarikan
 
Swift Generics in Theory and Practice
Swift Generics in Theory and PracticeSwift Generics in Theory and Practice
Swift Generics in Theory and PracticeMichele Titolo
 
RESTORATION OF EXISTING MAJOR BRIDGE ACROSS RIVER BHADAR ON NATIONAL HIGHWAY ...
RESTORATION OF EXISTING MAJOR BRIDGE ACROSS RIVER BHADAR ON NATIONAL HIGHWAY ...RESTORATION OF EXISTING MAJOR BRIDGE ACROSS RIVER BHADAR ON NATIONAL HIGHWAY ...
RESTORATION OF EXISTING MAJOR BRIDGE ACROSS RIVER BHADAR ON NATIONAL HIGHWAY ...IEI GSC
 
Mechatronics integrated aproach
Mechatronics integrated aproachMechatronics integrated aproach
Mechatronics integrated aproachRobert Mendez
 
Making friendly-microservices
Making friendly-microservicesMaking friendly-microservices
Making friendly-microservicesMichele Titolo
 
Chapter 8 - Robot Control System
Chapter 8 - Robot Control SystemChapter 8 - Robot Control System
Chapter 8 - Robot Control SystemHaffiz Radzi
 

Viewers also liked (18)

Protocols promised-land-2
Protocols promised-land-2Protocols promised-land-2
Protocols promised-land-2
 
Manual zanussi horno zob10401wk
Manual zanussi   horno zob10401wkManual zanussi   horno zob10401wk
Manual zanussi horno zob10401wk
 
Είμαι καταδικασμένος ?
Είμαι καταδικασμένος ?Είμαι καταδικασμένος ?
Είμαι καταδικασμένος ?
 
P diaz
P diazP diaz
P diaz
 
Samba
SambaSamba
Samba
 
Manual zanussi horno zob12401xk
Manual zanussi   horno zob12401xkManual zanussi   horno zob12401xk
Manual zanussi horno zob12401xk
 
Biodiversidad1
Biodiversidad1Biodiversidad1
Biodiversidad1
 
spoken english syllabus - Power point
spoken english syllabus - Power pointspoken english syllabus - Power point
spoken english syllabus - Power point
 
Digital Marketing for Trading Companies
Digital Marketing for Trading CompaniesDigital Marketing for Trading Companies
Digital Marketing for Trading Companies
 
Imo38013802 istatistik -2
Imo38013802 istatistik -2Imo38013802 istatistik -2
Imo38013802 istatistik -2
 
Swift Generics in Theory and Practice
Swift Generics in Theory and PracticeSwift Generics in Theory and Practice
Swift Generics in Theory and Practice
 
The Worst Code
The Worst CodeThe Worst Code
The Worst Code
 
Invest karnataka 2016: Focus sector ESDM
Invest karnataka 2016:  Focus sector ESDMInvest karnataka 2016:  Focus sector ESDM
Invest karnataka 2016: Focus sector ESDM
 
Multitasking
MultitaskingMultitasking
Multitasking
 
RESTORATION OF EXISTING MAJOR BRIDGE ACROSS RIVER BHADAR ON NATIONAL HIGHWAY ...
RESTORATION OF EXISTING MAJOR BRIDGE ACROSS RIVER BHADAR ON NATIONAL HIGHWAY ...RESTORATION OF EXISTING MAJOR BRIDGE ACROSS RIVER BHADAR ON NATIONAL HIGHWAY ...
RESTORATION OF EXISTING MAJOR BRIDGE ACROSS RIVER BHADAR ON NATIONAL HIGHWAY ...
 
Mechatronics integrated aproach
Mechatronics integrated aproachMechatronics integrated aproach
Mechatronics integrated aproach
 
Making friendly-microservices
Making friendly-microservicesMaking friendly-microservices
Making friendly-microservices
 
Chapter 8 - Robot Control System
Chapter 8 - Robot Control SystemChapter 8 - Robot Control System
Chapter 8 - Robot Control System
 

Similar to Debugging in lldb with advanced techniques

Windbg랑 친해지기
Windbg랑 친해지기Windbg랑 친해지기
Windbg랑 친해지기Ji Hun Kim
 
OpenWorld Sep14 12c for_developers
OpenWorld Sep14 12c for_developersOpenWorld Sep14 12c for_developers
OpenWorld Sep14 12c for_developersConnor McDonald
 
Linux kernel debugging(PDF format)
Linux kernel debugging(PDF format)Linux kernel debugging(PDF format)
Linux kernel debugging(PDF format)yang firo
 
Linux kernel debugging(ODP format)
Linux kernel debugging(ODP format)Linux kernel debugging(ODP format)
Linux kernel debugging(ODP format)yang firo
 
Compare mysql5.1.50 mysql5.5.8
Compare mysql5.1.50 mysql5.5.8Compare mysql5.1.50 mysql5.5.8
Compare mysql5.1.50 mysql5.5.8Philip Zhong
 
Nodejs性能分析优化和分布式设计探讨
Nodejs性能分析优化和分布式设计探讨Nodejs性能分析优化和分布式设计探讨
Nodejs性能分析优化和分布式设计探讨flyinweb
 
gumiStudy#2 実践 memcached
gumiStudy#2 実践 memcachedgumiStudy#2 実践 memcached
gumiStudy#2 実践 memcachedgumilab
 
Video Transcoding at the ABC with Microservices at GOTO Chicago
Video Transcoding at the ABC with Microservices at GOTO ChicagoVideo Transcoding at the ABC with Microservices at GOTO Chicago
Video Transcoding at the ABC with Microservices at GOTO ChicagoDaphne Chong
 
Applied Regression Analysis using R
Applied Regression Analysis using RApplied Regression Analysis using R
Applied Regression Analysis using RTarek Dib
 
metadatacoreProperties.xmlModel2015-07-13T030104Zthua3267th.docx
metadatacoreProperties.xmlModel2015-07-13T030104Zthua3267th.docxmetadatacoreProperties.xmlModel2015-07-13T030104Zthua3267th.docx
metadatacoreProperties.xmlModel2015-07-13T030104Zthua3267th.docxARIV4
 
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
 
Sangam 2019 - The Latest Features
Sangam 2019 - The Latest FeaturesSangam 2019 - The Latest Features
Sangam 2019 - The Latest FeaturesConnor McDonald
 
The forgotten art of assembly
The forgotten art of assemblyThe forgotten art of assembly
The forgotten art of assemblyMarian Marinov
 

Similar to Debugging in lldb with advanced techniques (20)

Windbg랑 친해지기
Windbg랑 친해지기Windbg랑 친해지기
Windbg랑 친해지기
 
OpenWorld Sep14 12c for_developers
OpenWorld Sep14 12c for_developersOpenWorld Sep14 12c for_developers
OpenWorld Sep14 12c for_developers
 
Linux kernel debugging(PDF format)
Linux kernel debugging(PDF format)Linux kernel debugging(PDF format)
Linux kernel debugging(PDF format)
 
Linux kernel debugging(ODP format)
Linux kernel debugging(ODP format)Linux kernel debugging(ODP format)
Linux kernel debugging(ODP format)
 
Compare mysql5.1.50 mysql5.5.8
Compare mysql5.1.50 mysql5.5.8Compare mysql5.1.50 mysql5.5.8
Compare mysql5.1.50 mysql5.5.8
 
Nodejs性能分析优化和分布式设计探讨
Nodejs性能分析优化和分布式设计探讨Nodejs性能分析优化和分布式设计探讨
Nodejs性能分析优化和分布式设计探讨
 
C&cpu
C&cpuC&cpu
C&cpu
 
Boosting Developer Productivity with Clang
Boosting Developer Productivity with ClangBoosting Developer Productivity with Clang
Boosting Developer Productivity with Clang
 
gumiStudy#2 実践 memcached
gumiStudy#2 実践 memcachedgumiStudy#2 実践 memcached
gumiStudy#2 実践 memcached
 
実践 memcached
実践 memcached実践 memcached
実践 memcached
 
Video Transcoding at the ABC with Microservices at GOTO Chicago
Video Transcoding at the ABC with Microservices at GOTO ChicagoVideo Transcoding at the ABC with Microservices at GOTO Chicago
Video Transcoding at the ABC with Microservices at GOTO Chicago
 
Applied Regression Analysis using R
Applied Regression Analysis using RApplied Regression Analysis using R
Applied Regression Analysis using R
 
chapter3
chapter3chapter3
chapter3
 
metadatacoreProperties.xmlModel2015-07-13T030104Zthua3267th.docx
metadatacoreProperties.xmlModel2015-07-13T030104Zthua3267th.docxmetadatacoreProperties.xmlModel2015-07-13T030104Zthua3267th.docx
metadatacoreProperties.xmlModel2015-07-13T030104Zthua3267th.docx
 
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
 
Sangam 2019 - The Latest Features
Sangam 2019 - The Latest FeaturesSangam 2019 - The Latest Features
Sangam 2019 - The Latest Features
 
The forgotten art of assembly
The forgotten art of assemblyThe forgotten art of assembly
The forgotten art of assembly
 
MySQLinsanity
MySQLinsanityMySQLinsanity
MySQLinsanity
 
chapter 4
chapter 4chapter 4
chapter 4
 
node-rpi-ws281x
node-rpi-ws281xnode-rpi-ws281x
node-rpi-ws281x
 

More from 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
 
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
 
API Jones and the Wireframes of Doom
API Jones and the Wireframes of DoomAPI Jones and the Wireframes of Doom
API Jones and the Wireframes of DoomMichele Titolo
 
Mastering the Project File
Mastering the Project FileMastering the Project File
Mastering the Project FileMichele Titolo
 
Automated Testing with GHUnit and KIF
Automated Testing with GHUnit and KIFAutomated Testing with GHUnit and KIF
Automated Testing with GHUnit and KIFMichele Titolo
 
How To Make APIs That Don't Suck
How To Make APIs That Don't SuckHow To Make APIs That Don't Suck
How To Make APIs That Don't SuckMichele Titolo
 

More from 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
 
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
 
Practical Cocoapods
Practical CocoapodsPractical Cocoapods
Practical Cocoapods
 
API Jones and the Wireframes of Doom
API Jones and the Wireframes of DoomAPI Jones and the Wireframes of Doom
API Jones and the Wireframes of Doom
 
Mastering the Project File
Mastering the Project FileMastering the Project File
Mastering the Project File
 
Automated Testing with GHUnit and KIF
Automated Testing with GHUnit and KIFAutomated Testing with GHUnit and KIF
Automated Testing with GHUnit and KIF
 
How To Make APIs That Don't Suck
How To Make APIs That Don't SuckHow To Make APIs That Don't Suck
How To Make APIs That Don't Suck
 

Recently uploaded

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
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureDinusha Kumarasiri
 
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in NoidaBuds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in Noidabntitsolutionsrishis
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...OnePlan Solutions
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanyChristoph Pohl
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...Technogeeks
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
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
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEOrtus Solutions, Corp
 
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
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...soniya singh
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
How to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfHow to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfLivetecs LLC
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfStefano Stabellini
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtimeandrehoraa
 

Recently uploaded (20)

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
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with Azure
 
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in NoidaBuds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
2.pdf Ejercicios de programación competitiva
2.pdf Ejercicios de programación competitiva2.pdf Ejercicios de programación competitiva
2.pdf Ejercicios de programación competitiva
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEE
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 
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
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
How to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfHow to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdf
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdf
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtime
 

Debugging in lldb with advanced techniques

  • 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
 (lldb) expr self.myCar.year = 2013 (NSInteger) $0 = 2013
 (lldb) po self.myCar
 2013 Tesla S UIDeviceRGBColorSpace 0 0 1 1
  • 19. fr v
  • 20. (lldb) fr v (ViewController *) self = 0x00007f9628520cd0
 (SEL) _cmd = "updateTipLabelsForBillAmount:"
 (float) billAmount = 33
 (float) tipPercentage = 0.200000003
 (float) tipAmount = 6.5999999
 (float) total = 39.5999985
  • 21. bt
  • 23. (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
  • 25.
  • 26.
  • 28.
  • 29.
  • 31.
  • 32.
  • 34.
  • 36. 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
  • 38. (lldb) process attach -p 5416 Process 5416 stopped
 * thread #1: tid = 0xe4b02, 0x0000000106e234de
 libsystem_kernel.dylib`mach_msg_trap + 10, queue = 'com.apple.main
 thread', stop reason = signal SIGSTOP
 frame #0: 0x0000000106e234de libsystem_kernel.dylib`mach_msg_trap +
 10
 libsystem_kernel.dylib`mach_msg_trap:
 -> 0x106e234de <+10>: retq
 0x106e234df <+11>: nop
 
 libsystem_kernel.dylib`mach_msg_overwrite_trap:
 0x106e234e0 <+0>: movq %rcx, %r10
 0x106e234e3 <+3>: movl $0x1000020, %eax
 
 Executable module set to "/Users/michele/Library/Developer/CoreSimulator/ Devices/5304657F-1710-42A1-87CA-E5358E87F4C8/data/Containers/Bundle/ Application/312BA401-3B1E-4A17-B7E8-BAAAE13EC463/Cars.app/Cars".
 Architecture set to: x86_64h-apple-ios. (lldb) c Process 5416 resuming
  • 39.
  • 40. help
  • 45.
  • 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 (lldb) c
 Process 3093 resuming
 (lldb)
  • 67.
  • 68. (lldb) br modify -c "speed==15 && self.gear==4” 2
  • 69. (lldb) br modify -c "speed==20 && [self canChangeGearTo:4]" 2
  • 70. (lldb) br modify -c "speed==15 && self.gear==4" -i 17 2
  • 71. -i <count> ( --ignore-count <count> ) Set the number of times this breakpoint is skipped before stopping.
  • 72. -i <count> ( --ignore-count <count> ) Set the minimum number of times this breakpoint is skipped before stopping.
  • 73. (lldb) br delete 2 1 breakpoints deleted; 0 breakpoint locations disabled.
  • 75. (lldb) breakpoint disable 2 1 breakpoints disabled. 
 ...
 2: file = 'Cars/ViewController.m', line = 31, locations = 1 Options: disabled
  • 76. (lldb) breakpoint enable 2 1 breakpoints enabled.
 ...
 2: file = 'Cars/ViewController.m', line = 31, locations = 1, resolved = 1, hit count = 1
  • 78. (lldb) br command add -o "fr v" 2 (lldb) fr v
 (Car *) self = 0x00007fb59ad142b0
 (SEL) _cmd = "changeGearTo:"
 (Gear) gear = Neutral
  • 79. (lldb) br command add 1 Enter your debugger command(s). Type 'DONE' to end.
 > fr v
 > continue
 > DONE
  • 80. (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.
  • 81. (lldb) br command list 3 Breakpoint 3:
 Breakpoint commands:
 fr v
  • 82. (lldb) br command delete 3
  • 83.
  • 85.
  • 86. a watchpoint tracks a value over time
  • 88. [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);
 }
 }
  • 89. - (void)setSpeed:(NSInteger)speed { _speed = speed; if (_speed > 1000) { NSLog(@"WHY AM I GOING SO FAST %ld", (long)_speed); } }
  • 93. (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
  • 94. watch modify -c … -i …
  • 95. (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)
  • 96.
  • 97. (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.
  • 98. 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
  • 100. (lldb) watch disable 1
 1 watchpoints disabled. (lldb) watch enable 1
 1 watchpoints enabled.
  • 101.
  • 102. script
  • 103.
  • 104. write code to debug your code
  • 106.
  • 107. script
  • 108. (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>]
  • 109. (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()
  • 111. def breakpoint_func(frame, bp_loc, dict): # implementation here # return false to skip current stack framebreakpoint locationpython session dictuseless
  • 113. only stop when -changeGearTo: is in the call stack
  • 114. 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()
  • 115. 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
  • 116. 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()
  • 117.
  • 118. br command add -s python #
  • 119. (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
  • 120. (lldb) br command add -s python 2 -o “print 1+1”
  • 121.
  • 123. Use a python function to better describe a class
  • 124. def Car_Summary(value,unused): make = value.GetChildMemberWithName("_make") model = value.GetChildMemberWithName("_model") makeSummary = make.GetSummary() modelSummary = model.GetSummary() return makeSummary + " " + modelSummary quit()
  • 125. 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
  • 126. def Car_Summary(value,unused): make = value.GetChildMemberWithName("_make") model = value.GetChildMemberWithName("_model") makeSummary = make.GetSummary() modelSummary = model.GetSummary() return makeSummary + " " + modelSummary quit()
  • 127.
  • 128. • Only break after another breakpoint has been hit • Check multiple threads for a symbol • Data formatters for everything • Custom LLDB commands More Use Cases
  • 129. swift
  • 130. p
  • 131. (lldb) po self.myCar <SwiftCars.Car: 0x7fe8bb456a60>
 (lldb) p *self.myCar error: <EXPR>:1:1: error: '*' is not a prefix unary operator
 *self.myCar
 ^
  • 132. (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
  • 135. (lldb) po self.canChangeGearTo(0) error: property 'canChangeGearTo' not found on object of type 'Car *'
 error: 1 errors parsing expression
  • 136. frame lang == lldb lang
  • 137. script
  • 139. 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 • https://developer.apple.com/library/mac/documentation/ IDEs/Conceptual/gdb_to_lldb_transition_guide/ document/lldb-terminal-workflow-tutorial.html