Section 6/161 menit
6. Evaluasi Ekspresi: po, p, dan expr
6. Evaluasi Ekspresi: po, p, dan expr
Memahami perbedaan antara po, p, dan expr adalah kunci penggunaan LLDB yang efektif.
po — Print Object Description
po memanggil properti debugDescription (atau description jika tidak ada). Untuk tipe Swift custom, ini menampilkan representasi yang ditulis developer. Untuk tipe Apple, ini seringkali lebih informatif daripada p.
swift
# po untuk object
(lldb) po myUser
▿ User
- id: "usr_123"
- name: "Budi Santoso"
- email: "budi@example.com"
- role: admin
# po untuk array
(lldb) po myArray
▿ 3 elements
▿ 0 : Item
- id: 1
▿ 1 : Item
- id: 2
▿ 2 : Item
- id: 3
# po untuk optional
(lldb) po optionalValue
Optional("hello world")
(lldb) po nilValue
nil
# po untuk memanggil computed property atau method
(lldb) po myUser.displayName
"Budi Santoso (admin)"
(lldb) po myArray.filter { $0.id > 1 }
p — Print dengan Type Formatter
p menggunakan LLDB's built-in type formatters — lebih cepat dari po karena tidak perlu memanggil Swift runtime, tapi kurang informatif untuk tipe kompleks.
swift
# p untuk nilai primitif (lebih cepat)
(lldb) p myInt
(Int) myInt = 42
(lldb) p myString
(String) myString = "hello"
(lldb) p myBool
(Bool) myBool = true
# p untuk struct (menampilkan semua stored properties)
(lldb) p myPoint
(CGPoint) myPoint = (x = 10.5, y = 20.3)
expr — Ekspresi Arbitrer
expr (singkatan e) adalah perintah paling powerful — bisa menjalankan ekspresi Swift arbitrer, memodifikasi variabel, bahkan mendefinisikan fungsi baru.
swift
# Memodifikasi variabel
(lldb) expr myCounter = 100
(lldb) expr myUser.name = "Test User"
# Memanggil fungsi
(lldb) expr myViewModel.loadData()
(lldb) expr UserDefaults.standard.removeObject(forKey: "auth_token")
# Mendefinisikan variabel baru (gunakan $ prefix)
(lldb) expr let $doubled = myValue * 2
(lldb) po $doubled
# Ekspresi multi-baris (ketik expr lalu Enter, akhiri dengan Enter kosong)
(lldb) expr
Enter expressions, then terminate with an empty line to evaluate:
1 let $filtered = myArray.filter { $0.isActive }
2 let $count = $filtered.count
3
(Int) $count = 5
# Import module untuk akses di expr
(lldb) expr import UIKit
(lldb) expr UIApplication.shared.keyWindow?.backgroundColor = .red
v — Variable View (Tercepat)
v adalah cara tercepat untuk melihat variabel lokal — tidak melibatkan Swift evaluator, murni membaca memory.
swift
# Tampilkan semua variabel di frame saat ini
(lldb) v
# Tampilkan variabel tertentu dan child-nya
(lldb) v myObject
(lldb) v myObject.items[0].price
# Sangat cepat, cocok untuk loop debugging
Perbedaan Kecepatan
| Perintah | Mekanisme | Kecepatan | Cocok untuk |
|---|---|---|---|
v |
Baca memory langsung | Tercepat | Variabel lokal sederhana |
p |
LLDB type formatter | Cepat | Primitif, struct sederhana |
po |
Swift runtime evaluation | Sedang | Object kompleks, custom description |
expr |
Full Swift compilation | Lambat | Modifikasi state, ekspresi kompleks |