Bod zlomu (breakpoint) — speciální značka v kódu, při jejímž dosažení ladící program pozastaví provádění programu pro inspekci stavu. Podle Apple Debugging Guide umožňují breakpoints vývojáři prohlížet hodnoty proměnných, zásobník volání a provádět krok za krokem bez změny zdrojového kódu. To je základní nástroj pro diagnostiku chyb a analýzu chování aplikace v reálném čase.
Hlavní body
Breakpoint — je aktivní značka umístěná na konkrétním řádku zdrojového kódu, při jejímž dosažení ladící program nuceně pozastaví provádění vlákna. V tuto chvíli získá vývojář úplnou kontrolu nad stavem aplikace: může zobrazit hodnoty všech proměnných v aktuálním rozsahu, prozkoumat zásobník volání, provést libovolné výrazy a pokračovat v provádění krok za krokem. Bez breakpoints by se ladění omezilo na nekonečné přidávání dočasných print výrazů s následným odstraňováním — přístup, který znečišťuje kód a neposkytuje interaktivní kontrolu.
Hlavním účelem breakpointu je lokalizace zdroje chyby. Když se aplikace chová neočekávaně, vývojář umístí bod zlomu před podezřelou část a postupně analyzuje, jaká data přicházejí na vstup, jak se mění proměnné a jakou cestou provádění postupuje. Podle údajů Apple je více než 70% chyb v mobilních aplikacích odhaleno právě pomocí breakpoints v kombinaci s prováděním krok za krokem, nikoli statickou analýzou kódu.
Breakpoints neovlivňují výkon release verze — jsou kompilovány pouze v Debug konfiguraci. V Xcode existuje speciální příznak DEBUG, který obklopuje ladící kód preprocesorovými direktivami. To zaručuje, že body zlomu neproniknou do App Store a nezpomalí práci koncových uživatelů.
Když procesor dosáhne řádku označeného breakpointem, dojde k hardwarovému nebo softwarovému přerušení. V Xcode se používá mechanismus SIGTRAP — signál trasování, který je zachycen ladícím programem. LLDB pozastaví všechna vlákna, předá řízení rozhraní Xcode a čeká na příkaz vývojáře: pokračovat (continue), přeskočit (step over), vstoupit (step into) nebo opustit (step out).
func fetchUserData(userId: Int) {
// LLDB se zde zastaví, pokud je nastaven breakpoint
let url = URL(string: "https://api.example.com/user/\(userId)")
var request = URLRequest(url: url)
request.httpMethod = "GET"
print("Fetching user \(userId)")
}
Ve výše uvedeném příkladu breakpoint umístěný na řádku let url = ... umožňuje zkontrolovat, které userId bylo předáno funkci, zda je URL správně sestaveno a jaké hlavičky jsou nastaveny v požadavku, než je provedeno síťové volání.
Xcode poskytuje pět základních typů breakpoints, z nichž každý řeší specifický úkol ladění. Pochopení jejich rozdílů umožňuje výběr optimálního nástroje pro každou situaci a zkracuje dobu diagnostiky 2–3krát ve srovnání s použitím pouze lineárních bodů zlomu.
| Typ breakpointu | Účel | Aktivace |
|---|---|---|
| Line breakpoint | Zastavení na konkrétním řádku kódu | Kliknutí na číslo řádku v editoru |
| Conditional breakpoint | Zastavení při splnění podmínky | Pravé tlačítko → Edit Breakpoint → Condition |
| Symbolic breakpoint | Zastavení při volání funkce/metody | Breakpoint Navigator → + → Symbolic Breakpoint |
| Exception breakpoint | Zastavení při vyvolání výjimky | Breakpoint Navigator → + → Exception Breakpoint |
| Error breakpoint | Zastavení při vzniku chyby (Swift) | Breakpoint Navigator → + → Swift Error Breakpoint |
Line breakpoint — nejběžnější typ. Nastavuje se jedním kliknutím na číslo řádku v editoru Xcode. Při dosažení tohoto řádku se provádění zastaví a vývojář může prozkoumat stav prostřednictvím panelu Debug Area nebo konzole LLDB. Podle statistik Stack Overflow používá více než 85% iOS vývojářů právě lineární breakpoints jako hlavní nástroj ladění a ostatní typy pro specifické scénáře, jako je ladění knihoven třetích stran nebo zachytávání výjimek.
Symbolic breakpoint umožňuje zastavit se při volání konkrétní metody nebo funkce, i když nemáte přístup ke zdrojovému kódu této metody. To je nepostradatelné při ladění systémových frameworků — například k zachycení okamžiku, kdy UIKit volá layoutSubviews. Nastavení zahrnuje název symbolu (např. -[UIView layoutSubviews] pro Objective-C nebo UIView.layoutSubviews() pro Swift) a volitelné parametry: modul, podmínku a počet přeskočení.
// Symbolic breakpoint pro zachycení layoutSubviews v UITableView
// Název symbolu: -[UITableView layoutSubviews]
// Akce: po UITableView.appearance()
class CustomTableView: UITableView {
override func layoutSubviews() {
super.layoutSubviews()
// Symbolic breakpoint zde zachytí volání
print("layoutSubviews called")
}
}
Podmíněný breakpoint se neaktivuje při každém dosažení řádku, ale pouze tehdy, když daný logický výraz má hodnotu true. To představuje obrovskou úspravu času při ladění smyček, zpracování polí a rekurzivních volání — místo ručního mačkání Continue pokaždé vývojář nastaví podmínku a ladící program se zastaví pouze v potřebném okamžiku.
Chcete-li přidat podmínku, klikněte pravým tlačítkem na breakpoint, vyberte Edit Breakpoint a do pole Condition zadejte výraz ve Swift nebo Objective-C. Povolena jsou porovnání, logické operátory a volání metod bez vedlejších účinků. Xcode vyhodnotí výraz v kontextu zastaveného programu, a pokud je pravdivý — ladící program zaznamená stav.
for index in 0..<1000 {
// Breakpoint s podmínkou: index == 500
// Ladící program se zastaví pouze na 501. iteraci
processItem(at: index)
}
Kromě podmínky může breakpoint provádět automatické akce bez zastavení programu. To je realizováno pomocí volby Automatically continue after evaluating v nastavení breakpointu. Akce zahrnují: výtisk hodnoty do konzole (po variable), přehrání zvukového signálu, provedení libovolného příkazu LLDB nebo spuštění shell skriptu. Tento přístup nahrazuje dočasné print a umožňuje protokolování dat bez změny zdrojového kódu.
// Breakpoint s akcí: po „Index: \(index), value: \(items[index])“
// Automatically continue = true → program se nezastaví
func processItems(_ items: [String]) {
for (index, item) in items.enumerated() {
// Zde breakpoint loguje každou iteraci bez zastavení
print("Processing \(item)")
}
}
Tato technika je zvláště užitečná při ladění UI aktualizací — například k protokolování všech změn rámů bez zásahu do kódu ovladače. Podle údajů Ray Wenderlich použití akcí breakpointu místo dočasných print výrazů zkracuje dobu ladění o 30–40% díky absenci potřeby čistit kód po dokončení.
Přestože Xcode poskytuje pohodlné grafické rozhraní, LLDB podporuje desítky příkazů pro programové řízení bodů zlomu přímo z konzole ladícího programu. To poskytuje možnosti nedostupné prostřednictvím GUI: hromadné vypnutí breakpoints podle regulárního výrazu, umístění bodů zlomu v dynamicky načtených knihovnách a vytváření složitých vícekrokových spouštěčů.
| Příkaz LLDB | Popis | Příklad |
|---|---|---|
| breakpoint set | Nastavit breakpoint | breakpoint set -f ViewController.swift -l 42 |
| breakpoint list | Zobrazit všechny breakpoints | breakpoint list |
| breakpoint disable | Vypnout breakpoint podle čísla | breakpoint disable 1 |
| breakpoint delete | Smazat breakpoint | breakpoint delete 1.2 |
| breakpoint modify | Změnit podmínku nebo akci | breakpoint modify -c "i > 100" 1 |
(lldb) breakpoint set -f LoginViewController.swift -l 15 -c "email.isEmpty"
Breakpoint 1: 15 locations added.
(lldb) breakpoint modify 1 -C "po email" -G true
(lldb) breakpoint list
1: name = 'LoginViewController.swift:15', condition = 'email.isEmpty'
1.1: addr = 0x1000a3b40
LLDB podporuje nastavení breakpoints podle regulárního výrazu pro názvy funkcí. To umožňuje zachytit všechny metody odpovídající vzoru — například všechny metody začínající na handle v konkrétní třídě. Tento přístup se používá při refaktorování a analýze neznámého kódu, kdy je třeba pochopit, které metody se podílejí na zpracování určité události.
(lldb) breakpoint set -r "handle[A-Z]" -s DataManager
Breakpoint 2: 6 locations.
(lldb) breakpoint set -r ".*Error.*"
Breakpoint 3: 23 locations.
Exception breakpoint zastaví provádění programu při vyvolání jakékoli výjimky — jak Objective-C, tak Swift chyby. V Xcode lze nastavit zachytávání pouze Objective-C výjimek, pouze Swift chyb nebo všech typů. To je nepostradatelný nástroj, když aplikace padá bez jasného označení místa v kódu — například při přístupu k již uvolněnému objektu.
Swift Error Breakpoint — specializovaný typ, který se objevil v Xcode 11. Zachycuje okamžik, kdy Swift funkce vyvolá chybu prostřednictvím throw, ještě než se dostane do catch bloku. To umožňuje vidět, která funkce chybu vygenerovala a s jakými argumenty, což je kriticky důležité při ladění složitých řetězců volání s více úrovněmi zpracování chyb.
enum NetworkError: Error {
case invalidURL
case noData
case decodingFailed(String)
}
func loadUserProfile(id: Int) throws -> UserProfile {
guard id > 0 else {
throw NetworkError.invalidURL
}
// Swift Error Breakpoint se zde zastaví při throw
return UserProfile(id: id, name: "Test")
}
Symbolické breakpoints jsou také účinné při ladění KVO a NotificationCenter. Umístěním breakpointu na observeValue(forKeyPath:of:change:context:) může vývojář zachytit všechna KVO oznámení v aplikaci, což pomáhá diagnostikovat neočekávané aktualizace UI nebo race conditions spojené se sledováním vlastností.
Efektivní použití breakpoints daleko přesahuje jednoduché zastavení na řádku. Zkušení vývojáři kombinují typy bodů zlomu s LLDB skripty, dočasnými zónami zastavení a exportem konfigurací pro reprodukovatelné ladění. Podívejme se na nejužitečnější techniky potvrzené praxí inženýrů Apple a Google.
Při ladění obtížně odhalitelných chyb použijte kombinaci breakpointu na vstupu do metody a watchpointu na změně klíčové proměnné. Umístěte lineární breakpoint před přiřazením a poté vytvořte watchpoint na proměnné pomocí příkazu LLDB watchpoint set variable. Když se hodnota změní, ladící program se zastaví bez ohledu na to, ze které části kódu modifikace proběhla. Podle údajů Google tento přístup umožňuje nalézt zdroj data race v 90% případů během jedné ladící relace.
(lldb) watchpoint set variable self->_balance
Watchpoint 1: addr = 0x600000c4b80 size = 8
state = enabled type = w
watchpoint spec: 'self._balance'
(lldb) watchpoint list
1: location = 0x600000c4b80, type = write, variable = '_balance'
Xcode umožňuje sdružovat breakpoints do skupin prostřednictvím Breakpoint Navigatoru. Vytvořte samostatnou skupinu pro každý scénář — například "přihlášení", "nákup", "síťové chyby". Při testování konkrétní funkcionality aktivujte pouze příslušnou skupinu a ostatní vypněte. To zabraňuje falešným aktivacím a urychluje ladění ve velkých projektech, kde počet bodů zlomu může přesáhnout několik desítek. Export skupiny do souboru umožňuje sdílet konfiguraci s kolegy prostřednictvím systému pro správu verzí.
Pro složité scénáře LLDB podporuje spouštění Python skriptů při aktivaci breakpointu. V akci breakpointu uveďte script import my_debug_helper; my_debug_helper.log_state(). To otevírá bezmezné možnosti: automatický sběr statistik, porovnávání stavů mezi voláními, generování zpráv o pokrytí kódu laděním. Podle údajů Apple je LLDB Python API používáno v Xcode Cloud pro automatickou analýzu pádů během CI testování.
Často kladené dotazy
Neaktivní breakpoints neovlivňují výkon — jsou kompilovány pouze v Debug konfiguraci. Aktivní body zlomu zpomalují provádění kvůli mechanismu hardwarového přerušení, ale pouze během ladění.
Ano, pomocí Symbolic breakpoint podle názvu metody nebo funkce. LLDB se zastaví při volání symbolu, i když zdrojový kód není k dispozici. Doplnkově lze použít disassembler LLDB pro provádění krok za krokem.
Step Over provede aktuální řádek celý (včetně volání funkcí) a zastaví se na následujícím. Step Into vstoupí do volané funkce a umožní její ladění krok za krokem. Step Out vrátí řízení volajícímu.
Breakpoints se automaticky ukládají do xcuserdata v rámci projektu. Pro předání kolegům použijte export přes Breakpoint Navigator → Share. Soubor .xcbkptlist lze přidat do repozitáře, pokud je ladění týmové.
Zkontrolujte Debug konfiguraci sestavení, aktivitu breakpointu (modrá ikona), správnost symbolu pro symbolic breakpoint a shodu zdrojového kódu se spustitelným binárním souborem — často pomůže Clean Build Folder.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také