lldb kann mehr als nur einfache Breakpoints oder po. In dem Vortrag zeigt Oliver Bayer, wie sich mit Hilfe von lldb Programmcode zur Ausführungszeit manipulieren lässt, ohne das hierfür der Sourcecode anzupassen ist. Sei es, damit Test- oder Debugcode nicht in die produktiv App gelangt, oder weil der Sourcecode für einen Teil der App nicht vorliegt.
Event: macoun, 04.10.2019
Speaker: Oliver Bayer, inovex
Mehr Tech-Vorträge: inovex.de/vortraege
Mehr Tech-Artikel: inovex.de/blog
20. Metabreakpoints
func do() {
…
let player = AVPlayer(playerItem: item)
…
}
br s -f Player.swift -l 4 -C "call player.isMuted = false"
-G true
21. Metabreakpoints
func do() {
…
let player = AVPlayer(playerItem: item)
// Hier der Breakpoint
…
}
br s -f Player.swift -p "// Hier der Breakpoint" -X do
-C "call player.isMuted = true" -G true
22. Metabreakpoints
•Auf dem Stack1 steht die Rücksprungadresse des Aufrufenden
•Nach dem Rücksprung steht die Adresse der AVPlayer Instanz in
Register rax1
[1] x86 Architekturen
23. Metabreakpoints
br s -S "-[AVPlayer init]" -K false
br command add
settings set target.language objc
br s -a `(unsigned long)*(unsigned long *)$rsp` -o true
-C "exp -l objc -- [(AVPlayer *)$rax setMuted: @YES]" -G
true
settings set target.language swift
continue
24. Metabreakpoints
br s -S "-[AVPlayer init]" -K false
br command add
settings set target.language objc
br s -a `(unsigned long)*(unsigned long *)$rsp` -o true
-C "exp -l objc -- [(AVPlayer *)$rax setMuted: @YES]" -G
true
settings set target.language swift
continue
25. Metabreakpoints
br s -S "-[AVPlayer init]" -K false
br command add
settings set target.language objc
br s -a `(unsigned long)*(unsigned long *)$rsp` -o true
-C "exp -l objc -- [(AVPlayer *)$rax setMuted: @YES]" -G
true
settings set target.language swift
continue
26. Metabreakpoints
br s -S "-[AVPlayer init]" -K false
br command add
settings set target.language objc
br s -a `(unsigned long)*(unsigned long *)$rsp` -o true
-C "exp -l objc -- [(AVPlayer *)$rax setMuted: @YES]" -G
true
settings set target.language swift
continue
27. Metabreakpoints
br s -S "-[AVPlayer init]" -K false
br command add
settings set target.language objc
br s -a `(unsigned long)*(unsigned long *)$rsp` -o true
-C "exp -l objc -- [(AVPlayer *)$rax setMuted: @YES]" -G
true
settings set target.language swift
continue
28. Metabreakpoints
br s -S "-[AVPlayer init]" -K false
br command add
settings set target.language objc
br s -a `(unsigned long)*(unsigned long *)$rsp` -o true
-C "exp -l objc -- [(AVPlayer *)$rax setMuted: @YES]" -G
true
settings set target.language swift
continue
29. Metabreakpoints
br s -S "-[AVPlayer init]" -K false
br command add
settings set target.language objc
br s -a `(unsigned long)*(unsigned long *)$rsp` -o true
-C "exp -l objc -- [(AVPlayer *)$rax setMuted: @YES]" -G
true
settings set target.language swift
continue
30. Neue Wege gehen mit thread
•Codepfade zur Laufzeit manipulieren
•Methoden kurzschließen
•Rückgabewerte ändern
32. Neue Wege gehen mit thread
•Nachteil an thread return et al. → bremst das Ausführen des Codes
aus
•Idee: (Binary) Patch → genauso schnell wie vorher